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:~$