docker教程

332 阅读5分钟

docker教程

一、docker是什么

​ docker是一个开源的容器引擎,基于LCX容器技术,使用Go语言开发,是一种快速解决生产问题的一种技术手段,开发、运行和部署应用程序的开放管理平台。采用C/S架构,可以轻松的为任何应用创建一个轻量级的、可以移植的、自给自足的容器。

二、docker镜像

​ 镜像是docker的可执行文件,其中包括运行程序所需的所有代码内容、依赖库、环境变量和配置文件等。通过镜像可以创建一个或多个容器。

  • 查看本机docker镜像列表

    sudo docker images

lcx@Ubuntu:~$ sudo docker images
#REPOSITORY		镜像仓库名称
#TAG			镜像的版本
#IMAGE ID		镜像ID
#CREATED		镜像创建时间
#SIZE			镜像大小
  • 搜索 DockerHub网站上的镜像

    docker search 镜像名

#这里以nginx为例
lcx@Ubuntu:~$ sudo docker search nginx
NAME	 DESCRIPTION					 STARS		OFFICIAL		AUTOMATED
nginx    Official build of Nginx.    	 13224      [OK]                
......
lcx@Ubuntu:~$ 
#NAME 					镜像仓库源的名称
#DESCRIPTION 			镜像的描述
#OFFICIAL 				是否 docker 官方发布
#stars					类似 Github 里面的 star,表示点赞、喜欢的意思。
#AUTOMATED				自动构建。
  • 拉取镜像

    docker pull 镜像名

lcx@Ubuntu:~$ sudo docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
afb6ec6fdc1c: Pull complete 
b90c53a0b692: Pull complete 
11fa52a0fdc0: Pull complete 
Digest: sha256:30dfa439718a17baafefadf16c5e7c9d0a1cde97b4fd84f63b69e13513be7097
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
lcx@Ubuntu:~$ sudo docker images
REPOSITORY       	TAG       	IMAGE ID        	CREATED             SIZE
nginx            	latest    	9beeba249f3e    	8 days ago          127MB
lcx@Ubuntu:~$ 
  • 重命名镜像

    docker tag 镜像仓库名:镜像版本 新名称:新版本

#镜像名称必须要小写,不能包含大写字母
#重命名镜像并不会删除原来的镜像
lcx@Ubuntu:~$ sudo docker tag nginx:latest nginx_lcx:rename
lcx@Ubuntu:~$ sudo docker images
REPOSITORY   	TAG     	IMAGE ID            CREATED             SIZE
nginx        	latest      9beeba249f3e        8 days ago          127MB
nginx_lcx    	rename      9beeba249f3e        8 days ago          127MB
lcx@Ubuntu:~$ 
  • 删除镜像
    • docker image rm 镜像名:镜像版本
    • docker rmi 镜像名:镜像版本
#两种命令都可以删除镜像
lcx@Ubuntu:~$ sudo docker rmi nginx_lcx:rename
Untagged: nginx_lcx:rename
lcx@Ubuntu:~$ sudo docker images
REPOSITORY       TAG         IMAGE ID            CREATED             SIZE
nginx            latest      9beeba249f3e        8 days ago          127MB
lcx@Ubuntu:~$
  • 导出镜像

    docker save -o 生成的文件名和路径 镜像名

lcx@Ubuntu:~$ sudo docker save -o nginx_docker.tar nginx
lcx@Ubuntu:~$ ls
nginx_docker.tar
lcx@Ubuntu:~$ 
  • 导入镜像

    docker load < 文件名

#切换到root用户下
lcx@Ubuntu:~$ su
Password: 
#将先前打包生成的nginx_docker.tar文件导入
root@Ubuntu:/home/lcx# sudo docker load < nginx_docker.tar
ffc9b21953f4: Loading layer [==================================================>]  72.49MB/72.49MB
2f4accd375d9: Loading layer [==================================================>]  58.12MB/58.12MB
6c7de695ede3: Loading layer [==================================================>]  3.584kB/3.584kB
Loaded image: nginx:latest

三、docker容器

       容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。 容器实际上就是进程。

  • 查看容器

    ​ docker ps -a(显示所有容器,包括未启动的)

root@Ubuntu:/home/lcx# docker ps
#CONTAINER ID        	容器ID
#IMAGE                  基于哪个镜像                               
#COMMAND                运行镜像时用的命令  
#CREATED                创建时间
#STATUS              	容器状态
#PORTS 					端口号
#NAMES					容器名称
  • 创建容器

    ​ docker create [参数] 依赖镜像 [容器内命令] [命令参数]

    ​ 参数:

    ​ -t 分配虚拟终端

    ​ -i 即使没有连接,也要把stdin打开

    ​ --name 给容器起名

#创建容器成功会返回容器ID
root@Ubuntu:/home/lcx# docker create -it --name nginx_lcx nginx ls -a
d66163ad3791227ed0cee1efb86a3cd7ca5c3513fb2945f1206bf2c0ed93cff3
root@Ubuntu:/home/lcx# docker ps -a
CONTAINER ID   	IMAGE   	COMMAND   	CREATED   			STATUS    PORTS   NAMES
d66163ad3791   	nginx   	"ls -a"   	22 seconds ago      Created           nginx_lcx
  • 容器重命名

    ​ docker rename 容器名称/ID 新名字

root@Ubuntu:/home/lcx# docker rename d66163ad3791 nginx_lcx2
root@Ubuntu:/home/lcx# docker ps -a
CONTAINER ID   	IMAGE   	COMMAND   	CREATED   			STATUS    PORTS   NAMES
d66163ad3791   	nginx   	"ls -a"   	22 seconds ago      Created           nginx_lcx2
  • 启动容器

    ​ docker start [参数] 依赖的镜像名/镜像ID

    ​ 参数:

    ​ -a 将当前shell的stdout和stderr连接到容器上

    ​ -i 将当前shell的stdin连接到容器上

root@Ubuntu:/home/lcx# docker start nginx_lcx
nginx_lcx
root@Ubuntu:/home/lcx# docker ps -a
CONTAINER ID   IMAGE   COMMAND   CREATED       	STATUS    				 PORTS      NAMES
d66163ad3791   nginx   "ls -a"   8 minutes ago  Exited (0) 12 seconds ago       nginx_lcx
  • 创建并启动容器

    ​ docker run [参数] 依赖的镜像名/镜像ID [执行的命令]

    ​ 参数:

    ​ -t 分配虚拟终端

      					   -i					  即使没有连接,也要把stdin打开
    

    ​ -d 在后台运行容器

    ​ --name 给容器起名

root@Ubuntu:/home/lcx# docker run -d --name nginx_lcx nginx 
74dea16aed50eabfca9e383e5e7b504b2d056255508e431459d41a244131c76f
root@Ubuntu:/home/lcx# docker ps -a
CONTAINER ID        IMAGE   COMMAND     CREATED     	STATUS        PORTS     NAMES
74dea16aed50        nginx   "nginx…"   35 seconds ago  Up 34 seconds  80/tcp	nginx_lcx

  • 暂停容器运行
    • 暂停容器 docker pause 容器名称/容器ID
    • 取消暂停容器 docker unpause 容器名称/容器ID
root@Ubuntu:/home/lcx# docker pause nginx_lcx
nginx_lcx
root@Ubuntu:/home/lcx# docker ps
CONTAINER ID  IMAGE  COMMAND   CREATED  		STATUS  			PORTS    NAMES
74dea16aed50  nginx  "nginx…"  14 hours ago   Up 14 hours (Paused)  80/tcp   nginx_lcx
root@Ubuntu:/home/lcx# docker unpause nginx_lcx
nginx_lcx
root@Ubuntu:/home/lcx# docker ps
CONTAINER ID  IMAGE  COMMAND   CREATED  		STATUS  	 PORTS    NAMES
74dea16aed50  nginx  "nginx…"  14 hours ago   Up 14 hours 	 80/tcp   nginx_lcx
  • 关闭容器
    • docker stop 容器名称/容器ID (若容器处理未结束,会延迟关闭)
    • docker kill 容器名称/容器ID (强制立即关闭容器)
root@Ubuntu:/home/lcx# docker stop 74dea16aed50
74dea16aed50
root@Ubuntu:/home/lcx# docker ps -a
CONTAINER ID  IMAGE    COMMAND     CREATED      STATUS     PORTS           NAMES
74dea16aed50   nginx   "nginx…"   14 hours ago  Exited (0) 9 seconds ago   nginx_lcx
  • 删除容器
    • docker rm 容器名称/容器ID (只能删除已关闭容器)
    • docker rm -f 容器名称/容器ID (强制删除容器,即使未关闭)
root@Ubuntu:/home/lcx# docker rm nginx_lcx
nginx_lcx
root@Ubuntu:/home/lcx# docker ps -a
CONTAINER ID  	IMAGE    	COMMAND     CREATED      STATUS    	 PORTS           NAMES
root@Ubuntu:/home/lcx#
  • 进入容器
    • 创建并进入容器 docker run --name 给容器起名 -it 依赖的镜像名/镜像ID bash
    • 进入容器 docker exec -it 容器ID bash (只能进入正在运行的容器)
root@Ubuntu:/home/lcx# docker run --name nginx_lcx -it nginx bash
root@0ba01a3941b6:/# ls
bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var
root@0ba01a3941b6:/# exit
exit
root@Ubuntu:/home/lcx# 
  • 退出容器
    • exit
    • ctrl+d

四、docker网络操作

  • 端口映射

    • 随机映射

      docker run -d -P 依赖镜像名

    • 指定映射

      docker run -d -p [宿主机IP]:[宿主机端口]:[容器端口] 依赖镜像名

lcx@Ubuntu:~$ sudo docker run -d --name nginx_lcx -P nginx
f5627badeb53862ad0f831b4f1560f6719369b2d24a6e37de535a1de17aaf8af
lcx@Ubuntu:~$ sudo docker ps -a
CONTAINER ID    IMAGE  COMMAND            CREATED     STATUS      PORTS            NAMES
f5627badeb53    nginx  "nginx -g 'daemon of…"   18 seconds ago      Up 15 seconds       0.0.0.0:32770->80/tcp    nginx_lcx
lcx@Ubuntu:~$ 
#从0.0.0.0:32770->80/tcp字段可以看出,容器的80端口被随机映射到了宿主机的32770端口
#将宿主机的9999端口映射到容器的80端口
lcx@Ubuntu:~$ sudo docker run -d --name nginx_lcx -p 127.0.0.1:9999:80 nginx
e7fb921bf5d3041ff70d30f69ae26a4624e59c90c16ae19d8671e404c7238692
lcx@Ubuntu:~$ sudo docker ps -a
CONTAINER ID   IMAGE    COMMAND     CREATED      STATUS      PORTS      NAMES
e7fb921bf5d3   nginx    "nginx -g 'daemon of…"   9 seconds ago       Up 6 seconds       127.0.0.1:9999->80/tcp   nginx_lcx
lcx@Ubuntu:~$
  • 查看容器映射端口

    docker port 容器名/容器ID

lcx@Ubuntu:~$ sudo docker port nginx_lcx
80/tcp -> 127.0.0.1:9999
lcx@Ubuntu:~$ 
  • docker的网络模式
网络模式 说明
bridge 默认模式,容器和宿主机将处于同一个子网下
host 容器和宿主机共享同一个网络
container 和另一个容器共享网络
none 不进行任何网络配置
  • 查看容器的网络模式
lcx@Ubuntu:~$ sudo docker inspect nginx_lcx | tail -n 20
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": 			"f4580fe841e052eb9e3fe92ef7afca619d87a7245636e8cc06a000c44d2b49fe",
                    "EndpointID": "be76d135d3dd1d7440cee3f966860f953235c150d8b155b49ba7056c8fc458b5",
                    "Gateway": "xxxx",
                    "IPAddress": "xxxx",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "xxxx",
                    "DriverOpts": null
                }
            }
        }
    }
]
lcx@Ubuntu:~$