数据卷
commit 构建镜像
#提交container为一个镜像(以容器为基础创建一个新镜像)
docker commit -m="message" -a="author" container-id image-name[:tag]
#容器数据卷,主机和容器的目录同步实现数据共享 -v
docker run -v 主机目录:容器目录 container-id
#查看卷是否挂载成功
docker inspect container-id
"Mounts": [
{
"Type": "bind",
"Source": "/home/test", #主机目录
"Destination": "/home/test", #容器目录
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
有以上信息说明挂载成功
匿名挂载
-v 容器内路径
具名挂载
-v 卷名:容器内路径
指定路径挂载
-v /主机路径:容器内路径
#查看所有卷信息
docker volume ls
注:没有指定路径挂载卷时,卷数据存储在宿主机的 /var/lib/docker/volumes/卷名/_data 路径下
#数据卷容器访问权限设置,宿主机无影响。
-v 卷名:容器路径:ro 只读
-v 卷名:容器路径:rw 可读可写
mysql安装示列
#下载mysql镜像
docker pull mysql:5.7
#后台运行mysql5.7,并设置数据卷挂载
docker run --name mysql01 -d -p 3300:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
--name 自定义容器名字
-d 后台运行
-p 端口映射 主机端口:容器端口
-v 数据卷挂载 主机目录:容器目录
-e 环境设置
容器删除后,卷对应的主机目录数据不会删除!即实现数据持久化功能
数据卷容器(容器间数据共享)
# container1 --volumes-from container2 实现两个容器自己的数据卷挂载,container2为container1的数据卷容器
docker run -it --name c1 --volumes-from c2 centos #使用centos镜像启动名为c1的容器其挂载于c2容器,实现容器间的数据共享,c2删除c1的数据不会受影响
Dockerfile 构建镜像
dockerfile:用于构建docker镜像的构建文件
dockerfile的指令:
FROM 指定基础镜像
MAINTAINER 指定维护者,镜像作者,姓名+邮箱
RUN 镜像构建时需要运行的命令
ADD 添加其他需要的镜像
WORKDIR 设置当前镜像工作目录,通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
VOLUME 挂载的目录
EXPOSE 指定暴露端口
CMD 容器启动时运行的命令。对于输入到镜像文件后的命令,会替换CMD后的命令。
ENTRYPOINT 容器启动时运行的命令。对于输入到镜像文件后的命令,会追加到ENTRYPOINT后的命令。
ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。
COPY 将文件拷贝到此镜像中,相当于ADD
ENV 构建时设置环境变量
通过dockerfile制作一个centos镜像
1.编写dockerfile构建文件:
vim centos-df #创建并打开centos-df 文件
#写入以下代码
FROM centos
MAINTAINER ztind<1356798719@qq.com>
RUN yum -y install vim
RUN yum -y install net-tools
ENV MYPATH /usr/local
WORKDIR $MYPATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
cat centos-df #查看文件内容
2.构建dockerfile文件为一个镜像
格式: docker build -f dockerfile文件地址 -t 构建成的镜像文件名[:tag] 输出地址
docker build -f centos-df -t mycentos:1.0 .
构建成功最后打印出:
Successfully built 59b771c8f1c7
Successfully tagged mycentos:1.0
查看镜像列表docker images:
[root@VM-0-9-centos dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.0 59b771c8f1c7 48 seconds ago 295MB
3.启动构建成功的镜像文件
docker run -it mycentos:1.0
运行容器后bash状态,可以用vim,ifconfig
[root@VM-0-9-centos dockerfile]# docker run -it mycentos:1.0
[root@32129408b569 local]# ls
bin etc games include lib lib64 libexec sbin share src
[root@32129408b569 local]#
查看镜像的构建历史信息
docker history 镜像id
注:dockerfile文件名官方推荐使用Dockerfile,-f xxx 就可以省略书写。docker build 会自动构建这个文件
4.发布镜像到Dockerhub
#登陆Dockerhub
docker login -u you-docker-id
Password:
#push推送镜像到Dockerhub
docker push you-docker-id/image-name:tag
问题:
[root@VM-0-9-centos dockerfile]# docker push docker1581/mycentos:1.0
The push refers to repository [docker.io/docker1581/mycentos]
An image does not exist locally with the tag: docker1581/mycentos
解决,重新为镜像生成一个tag版本,然后push这个版本:
docker tag image-id you-docker-id/image-name:tag
5.发布镜像到阿里云
- 登陆阿里云
- 选择容器镜像服务
- 创建命名空间
- 创建镜像服务
- 点击进入创建的镜像,看文档操作
6.退出登陆
docker logout
Docker 网络
查看网路相关命令
docker network --help
[root@VM-0-9-centos /]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
查看容器内部网路地址
docker ... ip addr
–link 实现容器之间的互链
docker run -d --name tomcate01 --link tomcate02 #tomcate01链到tomcate02
查看所有的docker网路
docker netwoek ls
网路模式
bridge 桥接模式,docker默认
host 和宿主机共享网路
none 不配置网路
container 容器网路互相连通
默认网络
docker run -d -P --name tomcat01 tomcat
等同
docker run -d -P --name tomcat01 --net bridge tomcat
# 默认创建的容器被添加到docker0网路
# --net bridge 命令就是创建默认的docker0网络,docker0为默认使用的网络,域名不可访问
1.创建一个网路
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# --driver bridge 桥接模式
# --subnet 192.168.0.0/16 子网
# --gateway 192.168.0.1 网关
2.查看刚创建的网路详情
[root@VM-0-9-centos /]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "8537ffad0dc5a8aff65d7b37b7ff03f4b75d27f4445cb054fe9893e857460e80",
"Created": "2020-09-14T11:17:36.373620202+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
[root@VM-0-9-centos /]#
3.将容器添加到刚创建的网络
#将启动的tomcat02添加到mynet网路
docker run -d -P --name tomcat02 --net mynet tomcat
4.此时,docker network inspect mynet命令可以看到tomcat02容器已经被添加到Containers配置里
[root@VM-0-9-centos /]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "8537ffad0dc5a8aff65d7b37b7ff03f4b75d27f4445cb054fe9893e857460e80",
"Created": "2020-09-14T11:17:36.373620202+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"81bc42046109c25b26124602fb8d1c12bb3f5fa9ff88d01117b661cec4610b4f": {
"Name": "tomcat02",
"EndpointID": "4ddced28d74e1022b717509bdb769229e3afa3c562a23fc5dfea8db8ef116761",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
5.自定义网路不使用–link,使用 ping container-name 也可以实现两容器之间的互连
6.使用 docker network connect [OPTIONS] NETWORK CONTAINER 实现在不同网路之间的容器链接到网路。
即tomcat01容器默认在docker0网路,tomcat02容器在我们刚创建的mynet网路。要实现tomcat01容器能通信到tomcat02容器,得使tomcat01链接到mynet网路即可(本质为在mynet的Containers配置下添加tomcat01容器的信息)。
docker network connect mynet tomcat01
ping测试:
[root@VM-0-9-centos /]# docker exec tomcat01 ping tomcat02
ping: tomcat02: Name or service not known #在未链接请ping失败,不可互通
[root@VM-0-9-centos /]# docker network connect mynet tomcat01 #将tomcat01容器链接到mynet网路
[root@VM-0-9-centos /]# docker network inspect mynet #查看mynet网路详情
[
{
"Name": "mynet",
"Id": "8537ffad0dc5a8aff65d7b37b7ff03f4b75d27f4445cb054fe9893e857460e80",
"Created": "2020-09-14T11:17:36.373620202+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"5a06929e51f110ad5f514a49d9eed9e26ca2ca201c47fd138beb339828cd40f9": {
"Name": "tomcat03",
"EndpointID": "1a11b2c4b1c148a82a419aa2b1caed583f8a7de550e99821a5e3beb9f5f7c4c7",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
},
"81bc42046109c25b26124602fb8d1c12bb3f5fa9ff88d01117b661cec4610b4f": {
"Name": "tomcat02",
"EndpointID": "4ddced28d74e1022b717509bdb769229e3afa3c562a23fc5dfea8db8ef116761",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"c03642d14a8d5aa92df392d022a930dea680614dfe152c6ce559fd1c024653b6": {
"Name": "tomcat01",
"EndpointID": "91bbaffee4070f92f49d75ba31a7579b1f8d6bf243b4d83e621548f73e8f6d76",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
[root@VM-0-9-centos /]# docker exec tomcat01 ping tomcat02
PING tomcat02 (192.168.0.2) 56(84) bytes of data. #connect后,ping成功
64 bytes from tomcat02.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.056 ms
64 bytes from tomcat02.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.051 ms
64 bytes from tomcat02.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.046 ms