(1)linux
(2)spingboot(非必要)
Docker概述
Docker安装
Docker命令
Docker镜像
容器数据卷
Dockerfile
Docker网络原理
IDEA整合Docker
Docker compose
Docker swarm
Li/CD
Jenkins
问题:我的程序在我的电脑上可以运行
docker的思想来源于集装箱
隔离:docker的核心思想
docker容器技术也是一种虚拟化技术
docker是基于go语言开发的
docker比虚拟机有更少的抽象层
docker利用宿主机的内核,vm需要guestos
镜像(imange):好比模板。用来创建容器服务
容器(contamer):独立运行一个或一组应用
仓库(repository):存放镜像,分为私有仓库和公有仓库(dockerhub)
docker是一个client-server结构的系统,守护进程运行在主机上,通过socker从客户端访问。Docker-server接收docker-client指令,从而执行这个指令
centos7
系统内核:
uname -r
系统版本:
cat /etc/os-release
1.卸载旧版本的docker
yum remove docker
2.安装需要的安装包
yum install -y yum-utils
3.设置镜像仓库(配置软件源,建议阿里云)
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新yum软件包索引
yum makecache fast
5.安装docker(ce社区版,ee企业版)
yum install docker-ce docker-ce-cli containerd.io
6.启动docker
systemetl start docker
7.验证docker是否安装成功
docker version
8.运行hello-world验证docker
docker run hello-world
#hello-world实现流程
9.查看下载的hello-world镜像
docker images
a.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
b.删除资源(rm -rf /var/lib/docker)
rm -rf /var/lib/docker
A.登录阿里云找到容器服务
B.找到镜像加速地址
C.配置使用
docker version #显示docker版本信息
docker info #显示docker系统信息,包括镜像容器数量
docker 命令 --help #帮助命令,查看命令的用法
docker images #查看本机上的镜像
可选项:-a 列出所有镜像 -q 只显示镜像的id
docker search (镜像名) #搜索镜像
可选项:例 --filter=start=3000 搜索出来镜像只显示start大于3000的镜像
docker pull (镜像名[:tar]) #下载镜像
docker rmi -f (id或镜像名) #删除指定镜像
docker rmi -f id id .... #删除多个镜像
docker rmi -f $(docker images -a) #删除全部镜像
注:有了镜像才可以创建容器
新建容器并启动
docker run [可选参数] [镜像id或镜像名]
#参数说明
--name="新的镜像名" #创建容器名。用以区分容器
-d #容器启动后后台运行
-it #容器启动后已交互方式运行,进入容器查看内容
-p [主机端口:容器端口] #映射容器端口
-P #映射随机端口
查看所有运行的容器
docker ps #查看所有正在运行的容器
#参数说明
-a #查看正在运行的容器和历史运行过的容器
-n=[数字] #查看最近创建的n个容器
-q #只显示容器编号
其他
exit #停止容器并退出
ctrl+p+q #容器不停止退出
删除容器
docker rm [容器id] #删除指定容器,不能删除正在运行的容器,可跟多个容器id,删除多个容器
docker rm -f $(docker ps -aq) #删除所有容器
docker ps -aq |xargs docker rm #删除所有容器
启动和停止容器
docker start [容器id] #启动容器
docker restart [容器id] #重启容器
docker stop [容器id] #停止容器
docker kill [容器id] #强制停止当前容器
常用命令
docker logs #查看日志
#参数
-tf #显示日志
--tail [n] #显示n条日志
docker top [容器id] #查看容器的进程信息
docker inspect [容器id] #查看镜像的元数据
docker exec -it [容器id] /bin/bash #进入容器并开启一个新的终端
docker attach [容器id] #进入容器正在执行的终端
docker cp [容器id]:[容器文件目录] [主机目录] #从容器中拷贝文件到主机
docker stats #查看cpu状态
注:
使用docker run -d [镜像名或id] 启动镜像后使用docker ps 命令发现并无此镜像,这个镜像已经停止运行
docker run -it --rm [容器名或id] #表示启动容器后删除容器,即用完即删,主要用于测试
portainer docker图形化界面管理工具
镜像是一种轻量、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行软件所需的所有内容,包括代码、运行库、环境变量和配置文件等,通常有以下获取方式:
1.从远程库下载
2.朋友拷贝
3.自己制作 (Dockerfile)
unionfs(联合文件系统):一种分层的、轻量级的高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。uniosfs文件系统是docker镜像的基础,镜像可以通过分层来继承,基于基础镜像,可以制作各种具体的镜像。
docker镜像加载原理。docker镜像实际上是由一层一层的文件系统组成的,这种层级文件就是unionfs,包括bootfs和rootfs
镜像的下载都是分层下载的
docker commit #提交镜像,使其成为一个新的镜像
docker commit -m="新镜像描述信息" -a="作者名" [镜像id] [目标镜像名]:[tag(版本)] #完整命令
-v #使用-v命令挂载
docker run -it -v [主机目录]:[容器内目录] #挂载容器目录
docker inspect [容器id] #查看其中的mount项看目录挂载是否成功
docker volume #查看所有的volume卷情况
匿名挂载:在挂载时只指定了容器内的路径未指定容器外路径
具名挂载:-v [卷名]:[容器内路径]
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的volume的情况
? ~ docker volume ls
DRIVER VOLUME NAME
local 33ae588fae6d34f511a769948f0d3d123c9d45c442ac7728cb85599c2657e50
# 这里发现,这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路径
# 具名挂载
? ~ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
? ~ docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 通过 -v 卷名:容器内路径
# 查看一下这个卷
-v [容器内路径] #匿名挂载
-v [卷名]:[容器内路径] #具名挂载
-v [主机目录]:[容器内目录] #指定路径挂载docker volume ls 是查看不到的
# 通过 -v 容器内路径: ro rw 改变读写权限
ro #readonly 只读
rw #readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
数据卷容器指多个容器之间进行数据同步
docker run -it --name [新容器名] --volumes-from [父容器名] [镜像名]
注:容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
dockerfile是用来构建docker镜像的文件!
构建步骤:
很多官方镜像都是基础包,很多功能是没有的,因此通常我们需要自己构建镜像
常用指令
FROM #基础镜像,一切从这里开始构建,如:FROM centos
MAINTAINER #镜像是书写的,姓名+邮箱
RUN #镜像构建时需要运行的命令
ADD #步骤,如tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR #镜像工作目录
VOLUME #挂载目录
EXPOST #保留端口配置(暴露端口)
CMD #指定容器启动时运行的命令,只有最后一个命令生效
ENTRYPOTNT #指定容器启动时运行的命令,可追加命令
ONBUILD #当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。
COPY #类似ADD,将文件拷贝到镜像中
ENV #构建时设置环境变量
docker history [镜像id] #列出镜像变更历史
# 1.编写Dockerfile文件
vim mydockerfile-centos
FROM centos
MAINTAINER cheng<1204598429@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "-----end----"
CMD /bin/bash
# 2、通过这个文件构建镜像
# 命令 docker build -f [文件名] -t [镜像名]:[tag] .
docker build -f mydockerfile-centos -t mycentos:0.1 .
准备tomcat 和 jdk压缩包,上传到linux中,编写好README文件(帮助文档,可不写) 。
Dockerfile
,使用官方命名在在build时可不用指定-f [文件名],它会自动寻找FROM centos
MAINTAINER cheng<1204598429@qq.com>
COPY README /usr/local/README #复制文件
ADD jdk-8u231-linux-x64.tar.gz /usr/local/ #复制镜像并解压
ADD apache-tomcat-9.0.35.tar.gz /usr/local/ #复制镜像并解压
RUN yum -y install vim
ENV MYPATH /usr/local #设置环境变量
WORKDIR $MYPATH #设置工作目录
ENV JAVA_HOME /usr/local/jdk1.8.0_231 #设置环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 #设置环境变量
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib #设置环境变量 分隔符是:
EXPOSE 8080 #设置暴露的端口
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.35/logs/catalina.out # 设置默认命令
# 因为dockerfile命名使用默认命名 因此不用使用-f 指定文件
$ docker build -t mytomcat:0.1 .
$ docker run -d -p 8080:8080 --name tomcat01 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logs mytomcat:0.1
访问测试
发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了!)
#登录
docker login -p [dockerhub官网账号密码] -u [dockerhub官网账号用户名]
#提交镜像
docker push [作者名]/[要提交的镜像名]:[版本号]
[root@hecs-x-medium-2-linux-20201216095547 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:6f:50:b1 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.202/24 brd 192.168.0.255 scope global noprefixroute dynamic eth0
valid_lft 59862sec preferred_lft 59862sec
inet6 fe80::f816:3eff:fe6f:50b1/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:c4:e3:42:40 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:c4ff:fee3:4240/64 scope link
valid_lft forever preferred_lft forever
#我们发现有本机有三个网络
l0: 本机回环地址
eth0: 本机内网地址
docker0: docker地址
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker run -it --name centos2 centos
[root@b491eaf50aaf /]# ipadddr
bash: ipadddr: command not found
[root@b491eaf50aaf /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
48: eth0@if49: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@hecs-x-medium-2-linux-20201216095547 ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.057 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.042 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.046 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.039 ms
#通过主机是可以ping通docker容器的
[root@hecs-x-medium-2-linux-20201216095547 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:6f:50:b1 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.202/24 brd 192.168.0.255 scope global noprefixroute dynamic eth0
valid_lft 58637sec preferred_lft 58637sec
inet6 fe80::f816:3eff:fe6f:50b1/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c4:e3:42:40 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:c4ff:fee3:4240/64 scope link
valid_lft forever preferred_lft forever
49: veth82d7ca1@if48: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 5a:3a:ac:15:e1:7c brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::583a:acff:fe15:e17c/64 scope link
valid_lft forever preferred_lft forever
思考:项目不重启,数据库ip地址改变,我们访问容器的IP地址是否也要改变?我们是否可以用名字来访问容器,这样无论ip如何变化,都不影响我们访问容器。
通过--link可以解决容器之间网络连通问题
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker run -it --name centos4 --link centos2 centos
[root@04c563284c71 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
52: eth0@if53: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@04c563284c71 /]# ^C
#在centos2上ping centos4发现可以ping通,但centos4 ping不通centos2
[root@b491eaf50aaf /]# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.062 ms
^C
--- 172.17.0.3 ping statistics ---
#查看centos2上的hosts文件,多了一个172.17.0.2 b491eaf50aaf配置
[root@b491eaf50aaf /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 b491eaf50aaf
[root@b491eaf50aaf /]#
通过--link技术无法实现容器名连接访问,我们一般不建议使用--link技术去实现容器间的访问
通常使用此模式实现容器互连
#查看所有docker网络
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5b68ddb1c185 bridge bridge local
cc9723858c9d host host local
ad8a7f493e34 none null local
[root@hecs-x-medium-2-linux-20201216095547 ~]#
# bridge:桥接(默认) none:不配置网络 host:和宿主机共享网络 container:容器内网络连接(用的少)
命令
--driver brige #定义模式(默认桥接)
--subnet 192.168.0.0/16 #定义ip
--gateway 192.168.0.1 #定义网关
#创建一个名为mymet的网络
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mymet
fc7402c6f30decc1c065dc98a6bcb9e95cb36af3e071800eff2d23d2bbbec890
#使用docker network ls查看是否创建成功
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5b68ddb1c185 bridge bridge local
cc9723858c9d host host local
fc7402c6f30d mymet bridge local
ad8a7f493e34 none null local
#使用docker network inspect mymet查看其具体内容是否和我们创建的一致
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker network inspect mymet
[
{
"Name": "mymet",
"Id": "fc7402c6f30decc1c065dc98a6bcb9e95cb36af3e071800eff2d23d2bbbec890",
"Created": "2020-12-18T11:07:12.00039337+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": {}
}
]
#使用--net命令创建两个容器
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker run -it --name centos1 --net mymet centos
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker run -it --name centos2 --net mymet centos
#查看各自的ip地址
[root@318e95ba3efb /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
57: eth0@if58: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.0.3/16 brd 192.168.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@a4cf1d734a4e /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
55: eth0@if56: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:c0:a8:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.0.2/16 brd 192.168.255.255 scope global eth0
valid_lft forever preferred_lft forever
#通过ip及容器名互ping,发现是没有任何问题的
[root@a4cf1d734a4e /]# ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.064 ms
^C
--- 192.168.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.064/0.067/0.071/0.008 ms
[root@a4cf1d734a4e /]# ping centos2
PING centos2 (192.168.0.3) 56(84) bytes of data.
64 bytes from centos2.mymet (192.168.0.3): icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from centos2.mymet (192.168.0.3): icmp_seq=2 ttl=64 time=0.050 ms
^C
--- centos2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1ms
rtt min/avg/max/mdev = 0.036/0.043/0.050/0.007 ms
[root@318e95ba3efb /]# ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.050 ms
^C
--- 192.168.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.050/0.058/0.066/0.008 ms
[root@318e95ba3efb /]# ping centos1
PING centos1 (192.168.0.2) 56(84) bytes of data.
64 bytes from centos1.mymet (192.168.0.2): icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from centos1.mymet (192.168.0.2): icmp_seq=2 ttl=64 time=0.048 ms
连通一个其他网卡的容器到创建的网卡,使其可以与此网卡上的容器互联
#创建一个新的容器,不指定网卡使用默认的docker0网卡
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker run -it --name centos3 centos
[root@aa8227884309 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
59: eth0@if60: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
#ping mymnt网卡上的容器时发现无法ping通
[root@aa8227884309 /]# ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
From 192.168.0.202 icmp_seq=1 Destination Host Unreachable
From 192.168.0.202 icmp_seq=2 Destination Host Unreachable
From 192.168.0.202 icmp_seq=3 Destination Host Unreachable
#使用connect命令将新容器连接到mymet网卡
[root@hecs-x-medium-2-linux-20201216095547 ~]# docker network connect mymet centos3
#测试,发现已经可以与mymet上的容器相互通信
[root@aa8227884309 /]# ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.068 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.051 ms
^C
--- 192.168.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.051/0.059/0.068/0.011 ms
[root@aa8227884309 /]# ping centos1
PING centos1 (192.168.0.2) 56(84) bytes of data.
64 bytes from centos1.mymet (192.168.0.2): icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from centos1.mymet (192.168.0.2): icmp_seq=2 ttl=64 time=0.055 ms
^C
--- centos1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.053/0.054/0.055/0.001 ms
#mymnt上的容器也可ping通此容器
[root@a4cf1d734a4e /]# ping centos3
PING centos3 (192.168.0.4) 56(84) bytes of data.
64 bytes from centos3.mymet (192.168.0.4): icmp_seq=1 ttl=64 time=0.034 ms
64 bytes from centos3.mymet (192.168.0.4): icmp_seq=2 ttl=64 time=0.053 ms
^C
--- centos3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1ms
rtt min/avg/max/mdev = 0.034/0.043/0.053/0.011 ms
#这种连接模式可称为一个容器两个ip
步骤:
docker-compose 轻松管理多个容器,定义运行多个容器
作用:批量容器编排
compose是docker的开源项目,需要安装
dockerfile让程序在任何地方运行
学习可参考官方文档:https://docs.docker.com/compose/
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#官方地址下载太慢,我们可以百度其他地址来下载
chmod +x /use/local/bin/docker-compose
docker-compose version
运行compose后,会创建一个compose网络,因此项目中的内容都在同一个网络下,可以互相访问
可大致分为3层
version:‘ ‘ #版本
service: #服务
服务1:
? 服务2:
? 服务配置
? 如:images: build:network等
其他配置,如:网络/卷,全局规则等
#例:docker-compose.yml文件
version: ‘3.3‘
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
原文:https://www.cnblogs.com/wenghaojie/p/14177277.html