基础教程
帮助命令
docker version #显示docker的版本信息。docker info #显示docker的系统信息,包括镜像和容器的数量docker 命令 --help #帮助命令
镜像命令
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替docker search #搜索镜像
容器命令
docker pull #下载镜像 docker image pulldocker rmi #删除镜像 docker image rmdocker imagesdocker images -a #列出所有镜像详细信息docker images -aq #列出所有镜像的iddocker search mysql #查询网上的mysql的镜像# --filter=STARS=3000 #过滤,搜索出来的镜像收藏STARS数量大于3000的#等价于docker pull tomcat:8docker pull docker.io/library/tomcat:8docker rmi -f 镜像id #删除指定id的镜像docker rmi -f $(docker images -aq) #删除全部的镜像docker stop $(docker ps -a -q) #停止所有的容器docker pull centos #docker中下载centosdocker run 镜像id #新建容器并启动docker container list -a # 查看所有的容器docker ps -a # 查看所有的容器docker rm 容器id #删除指定容器docker start 容器id #启动容器docker restart 容器id #重启容器docker stop 容器id #停止当前正在运行的容器docker kill 容器id #强制停止当前容器
docker run [可选参数] image | docker container run [可选参数] image#参书说明--name="Name" #容器名字 tomcat01 tomcat02 用来区分容器-d #后台方式运行-it #使用交互方式运行,进入容器查看内容-p #指定容器的端口 -p 8080(宿主机):8080(容器)-p ip:主机端口:容器端口-p 主机端口:容器端口(常用)-p 容器端口容器端口-P(大写) 随机指定端口
docker run -it centos /bin/bash # 测试、启动并进入容器exit #从容器退回主机docker ps 命令 #列出当前正在运行的容器 还没退出的(exit)-a, --all #列出当前正在运行的容器 + 带出历史运行过的容器-n=?, --last int #列出最近创建的?个容器 ?为1则只列出最近创建的一个容器,为2则列出2个-q, --quiet #只列出容器的编号
退出容器
exit #容器直接退出ctrl +P +Q #容器不停止退出 ---注意:这个很有用的操作
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rfdocker rm -f $(docker ps -aq) #删除所有的容器docker ps -a -q|xargs docker rm #删除所有的容器
后台启动
docker run -d centos #这都是看不到信息的# 问题docker ps. 发现centos 停止了# 常见的坑,docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
日志查看
docker logs --helpOptions:--details Show extra details provided to logs* -f, --follow Follow log output--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)* --tail string Number of lines to show from the end of the logs (default "all")* -t, --timestamps Show timestamps--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)➜ ~ docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #模拟日志#显示日志-tf #显示日志信息(一直更新)--tail number #需要显示日志条数docker logs -t --tail n 容器id #查看n行日志docker logs -ft 容器id #跟着日志
容器进程
#查看容器中进程信息psdocker top 容器id
查看元数据
docker inspect 容器iddocker inspect 镜像id
进入容器
# 方式一# 进入当前正在运行的容器docker exec -it 容器id bash shell# 方式二docker attach 容器id#测试docker attach 55321bcae33d正在执行当前的代码...区别#docker exec #进入当前容器后开启一个新的终端,可以在里面操作。(常用)#docker attach # 进入容器正在执行的终端
拷贝命令
#先进入到容器中docker exec -it 56a5583b25b4 /bin/bash#再创建一个新文件echo "hello" > hello.java # "hello"是内容 hello.java是文件名(souce命令用不了)#测试文件是否存在了cat hello.java#将容器中的文件拷贝到主机上# docker cp 容器名:容器内文件 主机上的路径docker cp 9035020356a4:/java.java /home
实例:docker安装Nginx
# 这种绑定宿主机端口的 是可以后台运行的 不会自动关闭# -d 后台运行# --name 给容器命名# -p 宿主机端口:容器内部端口docker run -d --name nginx01 -p 3344:80 nginxdocker exec -it nginx01 /bin/bash #进入容器 可用name进入ewhereis nginx #找到nginx位置# 跟宿主机绑定端口之后 之前ps start restart都可以使用测试了
实例2:docker安装tomcat
#以后台方式,暴露端口方式,启动运行docker run -d -p 8080:8080 --name tomcat01 tomcat#默认tomcat——》webapp没有可执行文件 可将webapp.dist下的文件复制到 webapps下cp -r webapps.dist/ webapps# 确保服务器的端口号开启 8080#测试访问有没有问题curl localhost:8080
commit镜像
"这样新增的副本比下下来的 镜像 强 有你增加的额外的功能"docker commit 提交容器成为一个新的副本# 命令和git原理类似docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[版本TAG]# 1、启动一个默认的tomcat[root@iz2zeak7sgj6i7hrb2g862z ~]# docker run -d -p 8080:8080 tomcatde57d0ace5716d27d0e3a7341503d07ed4695ffc266aef78e0a855b270c4064e# 2、发现这个默认的tomcat 是没有webapps应用,官方的镜像默认webapps下面是没有文件的!#docker exec -it 容器id /bin/bash[root@iz2zeak7sgj6i7hrb2g862z ~]# docker exec -it de57d0ace571 /bin/bashroot@de57d0ace571:/usr/local/tomcat## 3、从webapps.dist拷贝文件进去webapproot@de57d0ace571:/usr/local/tomcat# cp -r webapps.dist/* webappsroot@de57d0ace571:/usr/local/tomcat# cd webappsroot@de57d0ace571:/usr/local/tomcat/webapps# lsROOT docs examples host-manager manager# 4、将操作过的容器通过commit调教为一个镜像!我们以后就使用我们修改过的镜像即可,而不需要每次都重新拷贝webapps.dist下的文件到webapps了,这就是我们自己的一个修改的镜像。docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]docker commit -a="kuangshen" -m="add webapps app" 容器id tomcat02:1.0[root@iz2zeak7sgj6i7hrb2g862z ~]# docker commit -a="csp提交的" -m="add webapps app" de57d0ace571 tomcat02.1.0sha256:d5f28a0bb0d0b6522fdcb56f100d11298377b2b7c51b9a9e621379b01cf1487e[root@iz2zeak7sgj6i7hrb2g862z ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEtomcat02.1.0 latest d5f28a0bb0d0 14 seconds ago 652MBtomcat latest 1b6b1fe7261e 5 days ago 647MBnginx latest 9beeba249f3e 5 days ago 127MBmysql 5.7 b84d68d0a7db 5 days ago 448MBelasticsearch 7.6.2 f29a1ee41030 8 weeks ago 791MBportainer/portainer latest 2869fc110bf7 2 months ago 78.6MBcentos latest 470671670cac 4 months ago 237MBhello-world latest bf756fb1ae65 4 months ago 13.3kB
进阶教程
数据挂载
直接使用命令挂载 -v
-v, --volume list Bind mount a volumedocker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口# /home/ceshi:主机home目录下的ceshi文件夹 映射:centos容器中的/homedocker run -it -v /home/ceshi:/home centos /bin/bash#这时候主机的/home/ceshi文件夹就和容器的/home文件夹关联了,二者可以实现文件或数据同步了#通过 docker inspect 容器id 查看docker inspect 6064c490c371#这是查看容器的信息的 Mounts就是挂载的信息"Mounts": [{"Type": "bind","Source": "/home/ceshi", #本地"Destination": "/home", #容器"Mode": "","RW": true,"Propagation": "rprivate"}],
再来测试!
1、停止容器
2、宿主机修改文件
3、启动容器
4、容器内的数据依旧是同步的
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!
实例:安装mysql并挂载数据
# 获取mysql镜像docker pull mysql:5.7# 运行容器,需要做数据挂载 #安装启动mysql,需要配置密码的,这是要注意点!# 参考官网hubdocker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag#启动我们得-d 后台运行-p 端口映射-v 卷挂载-e 环境配置-- name 容器名字$ docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql03 mysql:5.7# 启动成功之后,我们在本地使用sqlyog来测试一下# sqlyog-连接到服务器的3306--和容器内的3306映射# 在本地测试创建一个数据库,查看一下我们映射的路径是否ok!
假设我们将包含mysql的容器删除时,
发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。
具名挂载、匿名挂载
# 匿名挂载-v 容器内路径!docker run -d -P --name nginx01 -v /etc/nginx nginx# 查看所有的volume(卷)的情况$ docker volume lsDRIVER VOLUME NAME # 容器内的卷名(匿名卷挂载)local 21159a8518abd468728cdbe8594a75b204a10c26be6c36090cde1ee88965f0d0local b17f52d38f528893dd5720899f555caf22b31bf50b0680e7c6d5431dbda2802c# 这里发现,这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路径!# 具名挂载 -P:表示随机映射端口$ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx9663cfcb1e5a9a1548867481bfddab9fd7824a6dc4c778bf438a040fe891f0ee# 查看所有的volume(卷)的情况$ docker volume lsDRIVER VOLUME NAMElocal 21159a8518abd468728cdbe8594a75b204a10c26be6c36090cde1ee88965f0d0local b17f52d38f528893dd5720899f555caf22b31bf50b0680e7c6d5431dbda2802clocal juming-nginx #多了一个名字# 通过 -v 卷名:查看容器内路径# 查看一下这个卷$ docker volume inspect juming-nginx[{"CreatedAt": "2020-05-23T13:55:34+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", #默认目录"Name": "juming-nginx","Options": null,"Scope": "local"}]" 所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/自定义的卷名/_data下,如果指定了目录,docker volume ls 是查看不到的。"
三种挂载方式区别
# 三种挂载: 匿名挂载、具名挂载、指定路径挂载-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就说明这个路径只能通过宿主机来操作,容器内部是无法操作!
Dockerfile
是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、 编写一个dockerfile文件
2、 docker build 构建称为一个镜像
3、 docker run运行镜像
4、 docker push发布镜像(DockerHub 、阿里云仓库)
网上的DockerFile很多
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
Dockerfile命令
FROM # from:基础镜像,一切从这里开始构建MAINTAINER # maintainer:镜像是谁写的, 姓名+邮箱RUN # run:镜像构建的时候需要运行的命令ADD # add:步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录WORKDIR # workdir:镜像的工作目录VOLUME # volume:挂载的目录EXPOSE # expose:保留端口配置CMD # cmd:指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代ENTRYPOINT # entrypoint:指定这个容器启动的时候要运行的命令,可以追加命令ONBUILD # onbuild:当构建一个被继承DockerFile这个时候就会运行onbuild的指令,触发指令COPY # copy:类似ADD,将我们文件拷贝到镜像中ENV # env:构建的时候设置环境变量!
实例:创建一个自定义centos
# 1./home下新建dockerfile目录mkdir dockerfile# 2. dockerfile目录下新建mydockerfile-centos文件vim mydockerfile-centos# 3.编写Dockerfile配置文件FROM centos # 基础镜像是官方原生的centosMAINTAINER fu<1@qq.com> # 作者ENV MYPATH /usr/local # 配置环境变量的目录WORKDIR $MYPATH # 将工作目录设置为 MYPATHRUN yum -y install vim # 给官方原生的centos 增加 vim指令RUN yum -y install net-tools # 给官方原生的centos 增加 ifconfig命令EXPOSE 80 # 暴露端口号为80CMD echo $MYPATH # 输出下 MYPATH 路径CMD echo "-----end----"CMD /bin/bash # 启动后进入 /bin/bash# 4.通过这个文件构建镜像# 命令: docker build -f 文件路径 -t 镜像名:[tag] .$ docker build -f mydockerfile-centos -t mycentos:0.1 .$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmycentos 0.1 cbf5110a646d 2 minutes ago 311MB# 6.测试运行docker run -it mycentos:0.1 # 注意带上版本号,否则每次都回去找最新版latestpwd/usr/local # 与Dockerfile文件中 WORKDIR 设置的 MYPATH 一致vim # vim 指令可以使用ifconfig # ifconfig 指令可以使用# docker history 镜像id 查看镜像构建历史步骤docker history 镜像id
ENV和ENENTRYPOINT区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
实战Tomcat镜像
#如果dockerfile是dockerfile build的时候就不需要输入文件名 默认就是dockerfilevim dockerfileFROM centos # 基础镜像centosMAINTAINER cao<1165680007@qq.com> # 作者COPY README /usr/local/README # 复制README文件ADD jdk-8u231-linux-x64.tar.gz /usr/local/ # 添加jdk,ADD 命令会自动解压ADD apache-tomcat-9.0.35.tar.gz /usr/local/ # 添加tomcat,ADD 命令会自动解压RUN yum -y install vim # 安装 vim 命令ENV MYPATH /usr/local # 环境变量设置 工作目录WORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_231 # 环境变量: JAVA_HOME环境变量ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 # 环境变量: tomcat环境变量ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.35# 设置环境变量 分隔符是:ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 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 .# 运行镜像# -d:后台运行 -p:暴露端口 --name:别名 -v:绑定路径$ docker run -d -p 8080:8080 --name tomcat01-v /home/tomcat/test:/usr/local/apache-tomcat-9.0.35/webapps/test-v /home/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.35/logs mytomcat:0.1# 测试访问$ docker exec -it 自定义容器的id /bin/bash$ cul localhost:8080
Docker网络
理解Docker 0
学习之前清空下前面的docker 镜像、容器
# 删除全部容器$ docker rm -f $(docker ps -aq)# 删除全部镜像$ docker rmi -f $(docker images -aq)# 查看地址 可看见地址的使用情况ip addr# 最下面肯定是自己创建的1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:16:3e:09:3d:27 brd ff:ff:ff:ff:ff:ffinet 172.16.25.125/20 brd 172.16.31.255 scope global dynamic noprefixroute eth0valid_lft 299906777sec preferred_lft 299906777sec3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether 02:42:5a:5a:30:41 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft forever59: veth49a5c33@if58: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group defaultlink/ether de:4d:2c:c0:4a:52 brd ff:ff:ff:ff:ff:ff link-netnsid 0
docker 是如果处理容器网络访问的?(容器跟容器的网络通信)
# 测试 运行一个tomcat$ docker run -d -P --name tomcat01 tomcat# 查看容器内部网络地址$ docker exec -it 容器id ip addr# 发现容器启动的时候会得到一个 eth0@if91 ip地址,docker分配!$ ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever261: eth0@if91: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0valid_lft forever preferred_lft forever# 思考? linux能不能ping通容器内部! 可以 容器内部可以ping通外界吗? 可以!$ ping 172.18.0.2PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.069 ms64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.074 ms
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要按照了docker,就会有一个docker0桥接模式,使用的技术是veth-pair技术!
我们来测试下tomcat01和tomcat02是否可以ping通
ip可以 名字不行
# 创建两个tomcat# 获取tomcat01的ip 172.17.0.2$ docker-tomcat docker exec -it tomcat01 ip addr550: eth0@if551: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever# 让tomcat02 ping tomcat01$ docker-tomcat docker exec -it tomcat02 ping 172.17.0.2PING 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.098 ms64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.071 ms# 结论:容器和容器之间是可以互相ping通 ip是可以ping通的 但是ping 容器名称就不行了
小节
Docker使用的是Linux的桥接,宿主机是一个Docker容器的网桥 docker0
Docker中所有网络接口都是虚拟的,虚拟的转发效率高(内网传递文件)
只要容器删除,对应的网桥一对就没了!
Link
docker exec -it tomcat02 ping tomca01 # ping不通 注意上面ping ip是可以的#结果ping: tomca01: Name or service not known# 运行一个tomcat03 --link tomcat02docker run -d -P --name tomcat03 --link tomcat02 tomcat5f9331566980a9e92bc54681caaac14e9fc993f14ad13d98534026c08c0a9aef# 3连接2# 用tomcat03 ping tomcat02 可以ping通# 这种命令是不进入docker里面运行一些命令[root@lisen ~]# docker exec -it tomcat03 ping tomcat02PING tomcat02 (172.17.0.3) 56(84) bytes of data.64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.124 ms64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.071 ms64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.078 ms# 2连接3# 用tomcat02 ping tomcat03 ping不通[root@lisen ~]# docker exec -it tomcat02 ping tomcat03ping: tomcat03: Name or service not known# 这说明这个link是单向的A --link b a就能ping通b
原理
docker inspect tomcat03 #可查看网络iddocker network inspect 网络id # 网段相同 都一样"Containers": {"da8e64ff0cff7cc5fb972e6378e5bdbe754b650087309287430f3f1da1745189": {"Name": "tomcat02","EndpointID": "dce022ed437d228f912436423e806add7dac9431b02d81a5d59417091597988c","MacAddress": "02:42:ac:11:00:03","IPv4Address": "172.17.0.3/16","IPv6Address": ""},"ed2dde073b32d62424372bc8cc71355873bac3da56bcc89aa0acc2c95a78cb26": {"Name": "tomcat01","EndpointID": "3a3a8a52450c1f75c325ed69b5620e28b6d8371e3190f9fae2a4569a43817f7d","MacAddress": "02:42:ac:11:00:02","IPv4Address": "172.17.0.2/16","IPv6Address": ""},"f0bfe130592b16b9e8abd017eeef2466cc0bfed78cfa3847a8db02c313688fcd": {"Name": "tomcat03","EndpointID": "742b907691b7387a51762bc417d7ac8957e0b33b39a283d990e96ae84cf489c1","MacAddress": "02:42:ac:11:00:04","IPv4Address": "172.17.0.4/16","IPv6Address": ""}},# 可查看links的信息docker inspect tomcat03"Links": ["/tomcat02:/tomcat03/tomcat02"],# docker02 是没有的 单向的# 查看tomcat03里面的/etc/hosts发现有tomcat02的配置[root@lisen ~]# docker exec tomcat03 cat /etc/hosts127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters172.17.0.3 tomcat02 da8e64ff0cff172.17.0.4 f0bfe130592b
–link 本质就是在hosts配置中添加映射
现在使用Docker已经不建议使用–link了!
自定义网络,不适用docker0!
docker0问题:不支持容器名连接访问!
自定义网络
docker networkconnect -- Connect a container to a networkcreate -- Creates a new network with a name specified by thedisconnect -- Disconnects a container from a networkinspect -- Displays detailed information on a networkls -- Lists all the networks created by the userprune -- Remove all unused networksrm -- Deletes one or more networks
查看所有的docker网络
[root@lisen ~]# docker network lsNETWORK ID NAME DRIVER SCOPE06402e764161 bridge bridge local14fe54efd95e host host local8988d4414cb5 none null local
网络模式
- bridge :桥接 docker(默认,自己创建也是用bridge模式)
- none :不配置网络,一般不用
- host :和所主机共享网络
- container :容器网络连通(用得少!局限很大)
```bash
我们直接启动的命令 —net bridge,而这个就是我们得docker0
bridge就是docker0
docker run -d -P —name tomcat01 tomcat等价于 =>
docker run -d -P —name tomcat01 —net bridge tomcat
docker0,特点:默认,域名不能访问。 —link可以打通连接,但是很麻烦!
我们可以 自定义一个网络
docker network create —driver bridge —subnet 192.168.0.0/16 —gateway 192.168.0.1 mynet
查看网络的 有刚才自定义的mynet
[root@lisen ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 06402e764161 bridge bridge local 14fe54efd95e host host local 74a7c0f53818 mynet bridge local 8988d4414cb5 none null local
查看mynet的信息
[root@lisen ~]# docker network inspect mynet [ { “Name”: “mynet”, “Id”: “74a7c0f53818c5a85a8298d570c8d8e811f27a3410188333c1c02c02d9c78711”, “Created”: “2020-09-03T14:33:31.928887101+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”: {} } ]
```bash# 创建两个tomcat容器 用mynet[root@lisen ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat:9.0.37[root@lisen ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat:9.0.37# 这是现在mynet的信息 Containers多了两个信息[root@lisen ~]# docker network inspect mynet[{"Name": "mynet","Id": "74a7c0f53818c5a85a8298d570c8d8e811f27a3410188333c1c02c02d9c78711","Created": "2020-09-03T14:33:31.928887101+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": {"adb7513f0131ea6a0618c39b87254f9fad6306592b2eabceb06346137f40ac5b": {"Name": "tomcat-net-02","EndpointID": "63c2cf7f8999cf3e17703f4dfd26ea4eb39ae61341824207ed0cd5fd8d40e181","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""},"cd335df7ea4ca079d66855ff3156f319c5b9b497d1169ebaca14b06a5274cd88": {"Name": "tomcat-net-01","EndpointID": "2cf1de0625c7c60a0b84c1fe0d132afeea260a40fece11ee181a2cd23f94c407","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""}},"Options": {},"Labels": {}}]#测试两者之间是否可以互相ping通 是可以的[root@lisen ~]# docker exec tomcat-net-01 ping tomcat-net-02PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.104 ms64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.090 ms64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.101 ms[root@lisen ~]# docker exec tomcat-net-02 ping tomcat-net-01PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.075 ms64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.085 ms64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.092 ms
SpringBoot微服务打包Docker镜像
FROM java:8COPY *.jar /app.jarCMD ["--server.port=8080"]EXPOSE 8080ENTRYPOINT ["java","-jar","app.jar"]# 1.复制jar和DockerFIle到服务器# 2.构建镜像$ docker build -t xxxxx:xx .
docker-compose
安装
1、下载curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose2、授权$ sudo chmod +x /usr/local/bin/docker-compose3、创建软连接,方便全局调用$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose4、测试是否安装成功$ docker-compose --versioncker-compose version 1.24.1, build 4667896b
Docker-Compose管理MySQL和Tomcat容器
yml文件以key:value方式指定配置信息 多个配置信息以换行+缩进的方式来区分 docker-compose.yml文件中,不要使用制表符 关键词:后面都是有一个空格的,比如:restart: always
以一个管理mysql+tomcat的yaml的容器为例
version:'3.1'services:mysql: # 服务的名称restart: always # 代表只要Docker启动,那么这个容器就跟着一起启动image: daocloud.io/library/mysql:5.7.4 # 指定镜像路径container_name: mysql # 指定容器名称ports:- 3306:3306 # 指定端口号的映射environment:MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码TZ: Asia/Shanghai # 指定时区volumes:- /opt/docker_mysql-tomcat/mysql_data:/var/lib/mysql # 映射数据卷tomcat:restart: always # 代表只要Docker启动,那么这个容器就跟着一起启动image: daocloud.io/library/tomcat:8.5.15-jre8 # 指定镜像路径container_name: tomcat # 指定容器名称ports:- 8080:8080 # 指定端口号的映射environment:MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码TZ: Asia/Shanghai # 指定时区volumes:- /opt/docker_mysql-tomcat/tomcat_webapps:/usr/local/tomcat/webapps # 映射数据卷- /opt/docker_mysql-tomcat/tomcat_logs:/usr/local/tomcat/logs # 映射数据卷
常用命令
# 1. 基于docker-compose.yml启动管理的容器docker-compose up -d# 2. 关闭并删除容器docker-compose down# 3. 开启|关闭|重启已经存在的由docker-compose维护的容器docker-compose start|stop|restart# 4. 查看由docker-compose管理的容器docker-compose ps# 5. 查看日志docker-compose logs -f
docker-compose配合Dockerfile使用
使用docker-compose.yml文件以及Dockerfile文件在生成自定义镜像的同时启动当前镜像,并且由docker-compose去管理容器
docker-compose.yml:
# yml文件version: '3.1'services:ssm:restart: alwaysbuild: # 构建自定义镜像context: ../ # 指定Dockerfile文件所在路径dockerfile: Dockerfile # 指定Dockerfile文件名称image: ssm:1.0.1container_name: ssmports:8081:8080environment:TZ: Asia/Shanghai
