Docker部署
Docker安装
[root@docker01 ~]# yum remove docker docker-common docker-selinux docker-engine
[root@docker01 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@docker01 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
[root@docker01 ~]# sed -i 's#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#' /etc/yum.repos.d/docker-ce.repo
[root@docker01 ~]# yum makecache fast
[root@docker01 ~]# yum install docker-ce -y
[root@docker01 ~]# docker version
[root@docker01 ~]# systemctl start docker
[root@docker01 ~]# systemctl enable docker
[root@docker01 ~]# docker version
镜像加速
#官网地址
https://www.daocloud.io/mirror
#加速命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
#阿里镜像加速地址
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
#加速命令
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
Docker 基础命令
[root@docker01 ~]# docker --help
Usage:
docker [OPTIONS] COMMAND [arg...]
docker daemon [ --help | ... ]
docker [ --help | -v | --version ]
A
self-sufficient runtime for containers.
Options:
--config string Location of client config files (default "/root/.docker") #客户端配置文件的位置
-D, --debug=false Enable debug mode #启用Debug调试模式
-H, --host=[] Daemon socket(s) to connect to #守护进程的套接字(Socket)连接
-h, --help=false Print usage #打印使用
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info") #设置日志级别
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem") #信任证书签名CA
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem") #TLS证书文件路径
--tlskey string Path to TLS key file (default "/root/.docker/key.pem") #TLS密钥文件路径
--tlsverify Use TLS and verify the remote #使用TLS验证远程
-v, --version Print version information and quit #打印版本信息并退出
......
Commands:
attach Attach to a running container #当前shell下attach连接指定运行镜像
build Build an image from a Dockerfile #通过Dockerfile定制镜像
commit Create a new image from a container's changes #提交当前容器为新的镜像
cp Copy files/folders from a container to a HOSTDIR or to STDOUT #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container #创建一个新的容器,同run 但不启动容器
diff Inspect changes on a container's filesystem #查看docker容器变化
events Get real time events from the server #从docker服务获取容器实时事件
exec Run a command in a running container #在已存在的容器上运行命令
export Export a container's filesystem as a tar archive #导出容器的内容流作为一个tar归档文件(对应import)
history Show the history of an image #展示一个镜像形成历史
images List images #列出系统当前镜像
import Import the contents from a tarball to create a filesystem image #从tar包中的内容创建一个新的文件系统映像(对应export)
info Display system-wide information #显示系统相关信息
inspect Return low-level information on a container or image #查看容器详细信息
kill Kill a running container #kill指定docker容器
load Load an image from a tar archive or STDIN #从一个tar包中加载一个镜像(对应save)
login Register or log in to a Docker registry #注册或者登陆一个docker源服务器
logout Log out from a Docker registry #从当前Docker registry退出
logs Fetch the logs of a container #输出当前容器日志信息
pause Pause all processes within a container #暂停容器
port List port mappings or a specific mapping for the CONTAINER #查看映射端口对应的容器内部源端口
ps List containers #列出容器列表
pull Pull an image or a repository from a registry #从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to a registry #推送指定镜像或者库镜像至docker源服务器
rename Rename a container #重命名容器
restart Restart a running container #重启运行的容器
rm Remove one or more containers #移除一个或者多个容器
rmi Remove one or more images #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
run Run a command in a new container #创建一个新的容器并运行一个命令
save Save an image(s) to a tar archive #保存一个镜像为一个tar包(对应load)
search Search the Docker Hub for images #在docker hub中搜索镜像
start Start one or more stopped containers #启动容器
stats Display a live stream of container(s) resource usage statistics #统计容器使用资源
stop Stop a running container #停止容器
tag Tag an image into a repository #给源中镜像打标签
top Display the running processes of a container #查看容器中运行的进程信息
unpause Unpause all processes within a container #取消暂停容器
version Show the Docker version information #查看容器版本号
wait Block until a container stops, then print its exit code #截取容器停止时的退出状态值
Docker镜像管理
搜索镜像docker search
[root@docker01 ~]# docker search nginx
NAME(名称) DESCRIPTION (描述) STARS(下载次数) OFFICIAL(官方) AUTOMATED(自动化创建)
nginx Official build of Nginx. 12451 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1715 [OK]
镜像选择建议
- 优先考虑官方
- stars数量最多
获取镜像docker pull
默认获取最新
[root@docker01 ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
729ec3a6ada3: Pull complete
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
指定版本获取
搜索镜像并查看该镜像的 tag 默认我们使用命令查看是看不到镜像的版本的,可以通过 docker-hub 查看,但是国内原因很慢, 这里可以使用仓库的 restful API 来查询 jq 是一个 json 格式化工具,需要提前安装 。
[root@docker01 ~]# yum install jq
[root@docker01 ~]# curl -s https://registry.hub.docker.com/v1/repositories/centos/tags|jq
说明:更换镜像名查看其它镜像就可以,这里将centos更换成其它的镜像名即可。
[root@docker01 ~]# curl -s https://registry.hub.docker.com/v1/repositories/nginx/tags|jq
[root@docker01 ~]# docker pull centos:7
私有仓库镜像pull
docker pull 镜像下载地址
查看镜像列表
[root@docker01 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f7bb5701a33c 10 days ago 126MB
centos 7 5e35e350aded 8 weeks ago 203MB
centos latest 0f3e07c0138f 3 months ago 220MB
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f7bb5701a33c 10 days ago 126MB
centos 7 5e35e350aded 8 weeks ago 203MB
centos latest 0f3e07c0138f 3 months ago 220MB
[root@docker01 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f7bb5701a33c 10 days ago 126MB
centos 7 5e35e350aded 8 weeks ago 203MB
centos latest 0f3e07c0138f 3 months ago 220MB
列表包括了仓库名、标签、镜像ID、创建时间以及所占用的空间。镜像ID则是镜像的唯一标识,一个镜像可以对应多个标签。
删除镜像
说明:使用docker rmi 删除本地镜像,后面可以跟镜像ID或者标签。(删除镜像之前先用docker rm 删除依赖于这个镜像的所有容器)。注意docker rm 命令是移除容器。
docker rmi [选项] <镜像1> [<镜像2> ...]
docker rmi imageID/imageName/
导出镜像 docker save
如果要导出镜像到本地,提供给另外一台机使用,可以使用docker save 或者docker image save 命令。
Docker save 镜像名称:tag -o 自定义名称.tar
[root@docker01 ~]# docker save nginx:latest -o nginx.tar.gz
[root@docker01 ~]# ls
nginx.tar.gz
[root@docker01 ~]# docker save nginx >/tmp/nginx1.tar.gz
[root@docker01 ~]# ls /tmp/
nginx1.tar.gz
导入镜像
通过docker save导出的镜像,通常需要通过docker load 导入,命令如下:
Docker load -i 名称.tar
[root@docker01 ~]# docker load -i nginx.tar.gz
[root@docker01 ~]# docker load
镜像打标签
[root@docker01 ~]# docker tag nginx:latest nginx:1.16.1
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_nginxsrc v6 7ed8dee10e66 2 days ago 541MB
nginx 1.16.1 c7460dfcab50 3 days ago 126MB
nginx latest c7460dfcab50 3 days ago 126MB
Docker容器管理
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一种是将在终止状态(stopped)的容器重新启动。
因为Docker的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。所以主要命令还是docker run
新建容器
[root@docker01 ~]# docker create -it centos /bin/bash #创建一个容器
77cabb640f4d2f18aca3449c96aa2467c763b7f0683ca89345465cfefa82b7eb
[root@docker01 ~]# docker ps -a #查看所有容器的状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77cabb640f4d centos "/bin/bash" 11 seconds ago Created ecstatic_ride
[root@docker01 ~]# docker start 77cabb640f4d #根据id启动之前的容器
77cabb640f4d
[root@docker01 ~]# docker ps #查看处于运行状态的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77cabb640f4d centos "/bin/bash" 41 seconds ago Up 6 seconds ecstatic_ride
[root@docker01 ~]# docker attach 77cabb640f4d #根据id进入到容器中
[root@77cabb640f4d /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@77cabb640f4d ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 03:48 pts/0 00:00:00 /bin/bash
root 16 1 0 03:49 pts/0 00:00:00 ps -ef
[root@77cabb640f4d ~]# exit #退出容器
exit
新建容器并启动docker run
#参数
-i, --interactive 交互式
-t, --tty 分配一个伪终端
-d, --detach 运行容器到后台
-a, --attach list 附加到运行的容器
--dns list 设置DNS服务器
-e, --env list 设置环境变量
--env-file list 从文件读取环境变量
-p, --publish list 发布容器端口到主机
-P, --publish-all 发布容器所有EXPOSE的端口到宿主机随机端口
-h, --hostname string 设置容器主机名
--ip string 指定容器IP,只能用于自定义网络
--link list 添加连接到另一个容器
--network 连接容器到一个网络
--mount mount 挂载宿主机分区到容器
-v, --volume list 挂载宿主机目录到容器
--restart string,容器退出时重启策略,默认no [always|on-failure]
--add-host list 添加其他主机到容器中/etc/hosts
-m,--memory 容器可以使用的最大内存量
--memory-swap 允许交换到磁盘的内存量--memory-swappiness=<0-100> 容器使用SWAP分区交换的百分比(0-100,默认为-1)
--memory-reservation 内存软限制,Docker检测主机容器争用或内存不足时所激活的软 限制,使用此选项,值必须设置低于—memory,以使其优先
--oom-kill-disable当宿主机内存不足时,内核会杀死容器中的进程。建议设置了memory选项再禁用OOM。如果没有设置,主机可能会耗尽内存
--cpus 限制容器可以使用多少可用的CPU资源
--cpuset-cpus 限制容器可以使用特定的CPU
--cpu-shares 此值设置为大于或小于默认1024值,以增加或减少容器的权重, 并使其可以访问主机CPU周期的更大或更小比例
例如:执行下面命令输出一个"hello world",之后容器自动终止。
[root@docker01 ~]# docker run -it centos echo "hello world"
hello world #这里是因为默认替换了CMD的执行主行主程序的命令,其真实执行的是CMD ["sh" ,"-c" ,"echo "hello world""] sh被认为是主程序,执行完成后退出,所以容器也就自动关闭。
[root@docker01 ~]# docker run -it centos /bin/echo "hello world"
hello world
启动一个bash终端,允许用户进行交互
[root@docker01 ~]# docker run --name centos7 -it centos /bin/bash
[root@45c206cfbb6f /]# pwd
/
--name: 给容器定义一个名称
-t:让Docker分配一个伪终端并绑定到容器的标准输入上
-i:让容器的标准输入保持打开
/bin/bash:执行一个命令
当利用docker run 来创建容器时,Docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
- 利用镜像创建一个容器,并启动该容器;
- 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
- 从网桥的地址池配置一个 IP 地址给容器;
- 执行用户指定的应用程序;
- 执行完毕后容器被自动终止。
启动已经终止的容器卷
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其他的资源。可以在伪终端利用 ps 或 top 来查看进程信息。
docker ps -a 可以查看所有容器的情况,docker ps 查看已启动容器的情况
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45c206cfbb6f centos "/bin/bash" 2 hours ago Exited (0) 9 seconds ago centos7
7c2b1ef25d95 centos "/bin/bash" 2 hours ago Exited (0) 2 hours ago dazzling_khayyam
49ca5a318bcf centos "/bin/echo 'hello wo…" 2 hours ago Exited (0) 2 hours ago agitated_hoover
90edf30620ef centos "echo 'hello world'" 2 hours ago Exited (0) 2 hours ago happy_wescoff
77cabb640f4d centos "/bin/bash" 3 hours ago Exited (0) 3 hours ago
[root@docker01 ~]# docker start 45c206cfbb6f
45c206cfbb6f
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45c206cfbb6f centos "/bin/bash" 2 hours ago Up 6 seconds
停止容器
可以使用 docker stop 来终止一个正在运行的容器。
此外,当Docker容器中指定的应用终结时,容器也会自动终结,例如启动一个终端容器,用户通过exit命令或者Ctrl+d 来退出终端时,所创建的容器立刻终止。
终止状态的容器可以用 docker ps -a 命令看到,也可以通过 docker start 命令来重新启动。
[root@docker01 ~]# docker stop 45c206cfbb6f
45c206cfbb6f
[root@docker01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
45c206cfbb6f centos "/bin/bash" 2 hours ago Exited (0) 9 seconds ago
后台进程运行
守护进程运行(后台运行)
更多的时候,需要让Docker容器在后台运行,而不是直接把执行命令的结果输出在当前宿主机下。此时可以加 -d 参数来实现。
[root@docker01 ~]# docker run -d centos /bin/bash -c "while true; do echo hello world; sleep 1; done"
b218728ce7f5345e991cd0b1c5331e66447aa13ab521261ad46b8c444f402620
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b218728ce7f5 centos "/bin/bash -c 'while…" 6 seconds ago Up 5 seconds kind_proskuriakova
[root@docker01 ~]# docker logs b218728ce7f5 #获取容器输出的信息,通过docker logs命令获取
hello world
hello world
hello world
进入程序
在使用 -d 参数时,容器启动后会进入后台,某些时候需要进入容器进行操作,有很多种房,包括 docker attach 命令或者 docker exec命令等。
attach命令
docker attach 是Docker自带的命令、
[root@docker01 ~]# docker run -itd centos
39b8b0ab96d45b3320517aa44ce30867a5cdd3d05c341bde161b95264bddf55f
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
39b8b0ab96d4 centos "/bin/bash" 19 seconds ago Up 19 seconds modest_keller
[root@docker01 ~]# docker attach 39b8b0ab96d4
[root@39b8b0ab96d4 /]#
[root@39b8b0ab96d4 /]# exit
exit
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
但是使用attach命令有时候并不方便,当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示,当某个窗口因命令阻塞,其他窗口也无法执行操作了。且通过exit退出后容器就自动终止了。
exec命令
exec 可以在容器内直接执行任意命令,此处我们也可以使用它进入到容器里面
[root@docker01 ~]# docker run -itd centos
d8e133187bf8a53f101b1e29e250d34733cbabadbd6ad5ec42f933db9da42987
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8e133187bf8 centos "/bin/bash" 53 seconds ago Up 52 seconds exciting
[root@docker01 ~]# docker exec -it d8e133187bf8 /bin/bash
[root@d8e133187bf8 /]#
[root@d8e133187bf8 /]# exit
exit
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8e133187bf8 centos "/bin/bash" 4 minutes ago Up 4 minutes exciting_euclid
导出和导入容器
Docker commit
(1).通过容器自作镜像(只有容器才有写入权限,但是一旦停止,写入的就会丢失,如果想保留,可以通过docker commit制作镜像进行保留)
注:只有docker export制作的镜像可以默认拷贝至其他的平台,docker commit制作的镜像默认在images列表,默认的不是一个tar文件,导出操作如下:
Docker commit 容器ID -m(说明)镜像名称:tag
导出docker images 列表中的镜像
Docker save 镜像名称:tag -o 自定义名称.tar
通过docker save导出的镜像,通常需要通过docker load 导入,命令如下:
Docker load -i 名称.tar
2.Docker export
将当前的 容器导成一个tar镜像文件;
Docker export 容器ID -o 自定义名称.tar/tar.gz
将tar镜像文件导入当前列表,并自定义名称版本:
Docker import 镜像文件.tar/tar.gz 镜像名称:tag
#导出镜像
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATU
d8e133187bf8 centos "/bin/bash" 4 minutes ago Up 4
[root@docker01 ~]# docker export d8e133187bf8 -o centos7.tar.gz
[root@docker01 ~]# ls
centos7.tar.gz
#导入镜像
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7.1 7f663fdb1dc1 9 seconds ago 220MB
容器删除
使用 docker rm 来删除一个处于终止状态的容器。
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8e133187bf8 centos "/bin/bash" 15 minutes ago Up 15 minutes exciting_euclid
#先停止docker
[root@docker01 ~]# docker stop d8e133187bf8
d8e133187bf8
#再删除容器
[root@docker01 ~]# docker rm d8e133187bf8
d8e133187bf8
如果要删除一个运行中的容器,可以添加 -f 参数。 Docker会发送 STGKILL信号给容器,再进行删除。
清理所有处于终止状态的的容器(慎用)
[root@docker01 ~]# docker run -itd centos
ba42dbe0296bea8a9a626553ce3694d1a17b67e82e51ff1aba25463df3990cde
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba42dbe0296b centos "/bin/bash" 12 seconds ago Up 11 seconds funny_kirch
[root@docker01 ~]# docker rm -f ba42dbe0296b
ba42dbe0296b
Docker的数据卷管理
Docker 容器中管理数据主要有两种方式:
数据卷(Data volumes)
数据卷容器(Data volumes containers)
数据卷
数据卷是一个可供一个或者多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即时容器被删除
管理数据卷
[root@docker01 ~]# docker volume create myvolume #创建一个数据卷
myvolume
[root@docker01 ~]# docker volume inspect myvolume #查看数据卷的信息
[
{
"CreatedAt": "2020-01-13T16:05:38+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
"Name": "myvolume",
"Options": {},
"Scope": "local"
}
]
[root@docker01 ~]# docker volume ls #查看数据列表
local myvolume
用卷创建一个容器
[root@docker01 ~]# docker run -itd --name mycentos --mount src=myvolume,dst=/data centos
4a027fe9f4a9de6767fc6a2381d02fa44de78b58d6658d4c3b0dea523569ace0
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4a027fe9f4a9 centos "/bin/bash" About a minute ago Up About a minute mycentos
[root@docker01 ~]# docker exec -it mycentos /bin/bash
[root@4a027fe9f4a9 /]# ls data/
#新开一个终端创建文件
[root@docker01 ~]# cd /var/lib/docker/volumes/myvolume/_data/
[root@docker01 /var/lib/docker/volumes/myvolume/_data]# ls
[root@docker01 /var/lib/docker/volumes/myvolume/_data]# touch test.txt
#查看文件
[root@4a027fe9f4a9 /]# cd data/
[root@4a027fe9f4a9 data]# ls
test.txt
src:数据卷名字
dst:需要挂载的目录路径
注意:如果没有创建指定卷,则自动创建,默认创建的事是匿名的数据局。
此时开启另外一个终端再次创建一个容器,并且挂载同样的数据卷,可以发现这种方式可以在容器之间共享和重用
[root@docker01 ~]# docker run -itd --name mycentos01 --mount src=myvolume,dst=/data centos
75e190aeccd3031558afd83baa7a30160c596792304796a4210d94db4bb48769
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75e190aeccd3 centos "/bin/bash" 5 seconds ago Up 4 seconds mycentos01
4a027fe9f4a9 centos "/bin/bash" 2 hours ago Up 2 hours mycentos
[root@docker01 ~]# docker exec -it mycentos01 /bin/bash
[root@75e190aeccd3 /]# ls data/
test.txt
上面创建容器并挂载数据卷,还可以使用下面这种方法 -v 数据卷名字:挂载路径,Docker挂载数据卷默认权限是读写,也可以通过 :ro 指定为只读。
[root@docker01 ~]# docker run -itd --name mycentos02 -v myvolume:/test:ro centos
dbc735c7f5056603b534c95a776662d71e817196f89327ca892cbb4bc555fc2f
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dbc735c7f505 centos "/bin/bash" 9 seconds ago Up 9 seconds mycentos02
75e190aeccd3 centos "/bin/bash" 7 minutes ago Up 7 minutes mycentos01
4a027fe9f4a9 centos "/bin/bash" 2 hours ago Up 2 hours mycentos
[root@docker01 ~]# docker exec -it dbc735c7f505 /bin/bash
[root@dbc735c7f505 /]# ls test/
test.txt
删除数据卷
Docker 不会在容器被删除后自动删除数据卷。且如果要删除数据卷,必须先将使用数据卷的容器停止,删除后,才能删除数据卷
[root@docker01 ~]# docker rm -f $(docker ps -qa)
dbc735c7f505
75e190aeccd3
4a027fe9f4a9
39b8b0ab96d4
716a492ee32a
[root@docker01 ~]# docker volume rm myvolume
myvolume
挂载一个主机目录作为数据卷
使用 -v 参数也可以指定挂载一个本地主机的目录到容器中
[root@docker01 ~]# docker run -itd --name web -v /webapp:/opt/webapp centos #创建一个挂载本地目录的容器
becbfc3e81ea9280aefb3884b1b1fa45ff773086bb520aa0852bd95b5710f49f
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
becbfc3e81ea centos "/bin/bash" 6 seconds ago Up 5 seconds web
[root@docker01 ~]# ls /webapp/ #本地没有会自动的创建
[root@docker01 ~]# echo "hello world" >/webapp/index.html #追加内容至文件
[root@docker01 ~]# ls /webapp/ #本地查看
index.html
[root@docker01 ~]# cat /webapp/index.html
hello world
[root@docker01 ~]# docker exec -it becbfc3e81ea /bin/bash #进入容器内部查看
[root@becbfc3e81ea /]# cat /opt/webapp/index.html
hello world
挂载一个宿主机文件作为数据卷
-v 参数也可以从主机挂载单个文件到容器中
root@docker01 ~]# echo "test" >test.txt
[root@docker01 ~]# docker run -itd --name web01 -v /root/test.txt:/opt/test.txt centos
d0b4b5347524171c8d214366ad17e0a3301209a0639e980b137969317c2b6b5e
[root@docker01 ~]# docker exec -it d0b4b5347524 /bin/bash
[root@d0b4b5347524 /]# cat /opt/test.txt
test
数据卷容器
如果有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。
数据卷容器其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
--volumes-from (跟某一个已经存在的容器挂载相同的卷)
[root@docker01 ~]# docker run -d -v /dbdata --name dbdata centos #创建一个数据卷容器
64ae39622380535beb3ff76d0b922018f53bbf3dad74f4f46b092296df0849ef
[root@docker01 ~]# docker run -d -it --volumes-from dbdata --name db01 centos #创建一个容器db01使用--volumes-from挂载dbdata.
0646d45189469572482df94d8b8a177b2afa02b0f4d9cc83ad755010f98cb343
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0646d4518946 centos "/bin/bash" 15 seconds ago Up 14 seconds db01
[root@docker01 ~]# docker exec -it 0646d4518946 /bin/bash #登录容器内部查看
[root@0646d4518946 /]# ls
bin dev home lib64 media opt root sbin sys usr
dbdata etc lib lost+found mnt proc run srv tmp var
[root@0646d4518946 /]# touch dbdata/file1 #创建一个文件
[root@docker01 ~]# docker run -d -it --volumes-from dbdata --name db02 centos #创建第二个挂载数据卷容器的容器db02
f5c952b1dba0dc5578b1c2e703b3380565eecfda353d9583499d7749259dc5ce
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5c952b1dba0 centos "/bin/bash" 5 seconds ago Up 4 seconds db02
0646d4518946 centos "/bin/bash" 4 minutes ago Up 4 minutes db01
[root@docker01 ~]# docker exec -it f5c952b1dba0 /bin/bash
[root@f5c952b1dba0 /]# ls dbdata/ #查看文件存在证明数据共享。
file1
从上面可以看出可以使用超过一个 --volumes-from 参数来指定从多个容器挂载相同的的数据卷,也可以从其他已经挂载了数据卷的容器来级联挂载数据卷,示例:
[root@docker01 ~]# docker run -itd --name db03 --volumes-from db01 centos
622211d51fdcf143d09fb0f1c760aeb9652bbb063acda3692dd01a14dae6e630
[root@docker01 ~]# docker exec -it 622211d51fdcf143 /bin/bash
[root@622211d51fdc /]# ls dbdata/
file1
注意:使用 --volumes-from 参数所挂载数据卷的容器自己并需要保持在运行状态。如果删除了挂载的容器(包括dbdata、db01和db02),数据卷也不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。
Docker容器的网络
Docker 允许通过外部访问容器或容器互联的方式来提供网络服务。
外部访问容器
容器中可以运行一些网络应用,比如(nginx,apache,php等),要让外部访问这些应用可以通过 -P 或者 -p 参数来制定端口映射
使用 -P 参数时,Docker 会随机映射一个 端口到内部容器开放的网络端口。
[root@docker01 ~]# docker run -d -P centos_nginxsrc:v4
db1eeff2a8071addb6e1dc449605f49371d3e4d1a1bb19aed101b7448a4f3c5a
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db1eeff2a807 centos_nginxsrc:v4 "nginx -g 'daemon of…" 12 seconds ago Up 11 seconds 0.0.0.0:32768->80/tcp friendly_lichterman
[root@docker01 ~]# curl localhost:32768
Welcome to nginx!
...
-p (小写的)则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。格式有:
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
映射所有的接口的地址
# hostPort:containerPort#使用hostPort:containerPort 格式宿主机的88端口映射到容器的80端口,默认会绑定宿主机所有接口上的所有地址
[root@docker01 ~]# docker run -d -p 80:80 --name nginx01 centos_nginxsrc:v4
7f1d7713a0428af350ab86518574ab8fcdf57c9ca41b70fe395a9c9e4630b12c
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f1d7713a042 centos_nginxsrc:v4 "nginx -g 'daemon of…" 6 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp nginx01
映射到指定地址的指定端口
#ip:hostPort:containerPort#使用ip:hostPort:containerPort 格式指定映射使用一个特定地址,如localhost地址127.0.0.1
[root@docker01 ~]# docker run -d -p 127.0.0.1:81:80 --name nginx02 centos_nginxsrc:v4
6b890b75c42422bdd6d0ef9c37bef224df785fa8093376bc25cd28f3aa78cdd0
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b890b75c424 centos_nginxsrc:v4 "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 127.0.0.1:81->80/tcp nginx02
映射到指定地址的任意端口
#ip::containerPort #使用ip:containerPort 绑定localhost的任意端口到容器的80端口,宿主机会自动分配一个端口
[root@docker01 ~]# docker run -d -p 127.0.0.1::80 --naem nginx03 centos_nginxsrc:v4
85f70aee5540c087c9d28dda50f2c8f1b093ddac7b00379ac245861327639958
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85f70aee5540 centos_nginxsrc:v4 "nginx -g 'daemon of…" 7 seconds ago Up 5 seconds 127.0.0.1:32768->80/tcp nginx03
指定udp端口
[root@docker01 ~]# docker run -d -p 127.0.0.1:82:80/udp --name nginx04 centos_nginxsrc:v4
2f178794f66c87ab8e5c77f5aaf73f2e9dfdfab2ed0d26a2aaa4f13a9cda733d
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f178794f66c centos_nginxsrc:v4 "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 80/tcp, 127.0.0.1:82->80/udp nginx04
查看映射端口配置
使用 docker port 查看当前映射的端口配置,也可以查看到绑定的地址
[root@docker01 ~]# docker port nginx04
80/udp -> 127.0.0.1:82
注意:
容器有自己内部网络地址和ip地址(使用 docker inspect 可以获取所有变量,Docker 还可以有一个可变的网络配置)
-p 标记可以多次使用来绑定多个端口
[root@docker01 ~]# docker run -d -p 127.0.0.1:82:80 -p 8080:443 --name nginx05 centos_nginxsrc:v4
433436861a5a4fb46503cac5a76c206f278a262270be9e4135f8d27b6aacc239
[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
433436861a5a centos_nginxsrc:v4 "nginx -g 'daemon of…" 9 seconds ago Up 8 seconds 127.0.0.1:82->80/tcp, 0.0.0.0:8080->443/tcp nginx05
容器互联
容器的连接(linking)系统除了端口映射外,另一种是容器中应用交互的方式。该系统会在源和接收容器之间创建一个隧道,接受容器可以看到源容器指定的信息。
请参考docker网络配置:https://www.jianshu.com/writer#/notebooks/41877344/notes/58850036