随笔——Docker学习笔记
Docker学习笔记
- 一、Docker 安装
- 二、Docker常用命令
- 注意事项
- 1、删除容器
- 2、删除镜像
- 3、容器中命令
- 4、容器的生命周期
- 5、Dockerfile构建镜像
- 6、docker两个特点:
- 7、dockerfile基础命令
- 8、RUN 命令执行格式
- 9、ENTRYPOINT 与CMD命令
- 三、构建redis镜像
- 四、容器间通信
- 1、 容器间的单向通信
- 2、利用网桥(Bridge)实现容器间的双向通信
- 3、容器间的数据共享(Volume)
- 五、Docker-compose容器编排工具
- 应用实战
- docker相关异常
一、Docker 安装
yum install -y yum-utils device-mapper-persistent-data lvm2
# -y 自动确认安装
# yum-utils yum工具包,可以简化安装
# device-mapper-persistent=data,lvm2 是两个数据存储驱动包,docker中进行数据存储需要依赖这两个包
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# yum-config-manager yum-utils提供的简化工具包,用于修改安装源
# --add-repo 设置新的安装源
# http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 阿里云安装源
yum makecache fast
# 缓存下载速度最快的数据源
yum -y install docker-ce
# docker-ce 安装免费的社区版docker
# docker-ee 收费的企业版
# 安装过程中会自动安装客户端和服务器
service docker start #启动docker服务
systemctl enable docker #设置开机启动,不设置或许会出现一些问题
docker version #查看docker版本,验证是否启动,docker是B/S服务,有一个客户端一个服务器
docker pull hello-world #从国外远程中央仓库中拉取hello-world镜像,下载到本地
docker run hello-world #启动运行镜像[root@VM-0-15-centos ~]# docker run hello-worldHello from Docker! #表示启动成功
This message shows that your installation appears to be working correctly.
二、Docker常用命令
hub.docker.com #docker 远程仓库网址docker pull 镜像名<:tags> #从远程仓库中抽取镜像 ,tags :版本号,如果不指定会拉取最新的版本
docker images #查看本地镜像
docker run 镜像名<::ags> #创建容器,启动应用docker run -p 8000:8080 tomcat #启动tomcat容器,-p 添加端口映射 宿主机:容器docker run -p 8888:8080 -d tomcat # -d 后台启动
docker ps #查询正在运行中的容器
docker ps -a #查看所有的容器
docker rm <-f> 容器id #删除容器,-f 代表强制删除
docker rmi <-f> 镜像名:<tags> #删除镜像
netstat -tulpn # 查看应用端口
docker inspect 3dd70489b867 #获取容器/镜像的元数据
docker network ls #查看当前dockers 网络服务清单
注意事项
docker启动容器后页面访问报404:源服务器未能找到目标资源的表示或者是不愿公开一个已经存在,如tomcat
解决方法
查看防火墙状态
[root@VM-0-15-centos /]# service firewalld status Redirecting to /bin/systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (dead)Docs: man:firewalld(1) # disabled 表示防火墙已关闭
如果防火墙未关闭
# 关闭防火墙 systemctl stop firewalld.service # 禁止防火墙开机启动 systemctl disable firewalld.service # 启动docker systemctl start docker # 重启docker systemctl restart docker
如果关闭防火墙依然失败,则进入tomcat容器
docker exec -it a5f02a3e6dde /bin/bash
将webapps.dist文件夹下的文件都复制到webapps文件夹下
root@b9e7a6065ac4:/usr/local/tomcat# cp -r webapps.dist/* webapps
重启容器
[root@VM-0-15-centos /]# docker restart b9e7a6065ac4
1、删除容器
oot@VM-0-15-centos ~]# docker ps # 查看运行中的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
213193490a95 tomcat "catalina.sh run" 9 seconds ago Up 7 seconds 8080/tcp competent_brown
69099af40517 tomcat "catalina.sh run" 12 minutes ago Up 12 minutes 0.0.0.0:8888->8080/tcp vigilant_lichterman
[root@VM-0-15-centos ~]# docker rm 213193490a95 #直接删除运行中的容器会报错
Error response from daemon: You cannot remove a running container 213193490a95b1e753bd34d44694a987058c57d668c27adf6a2daec34e9cebec. Stop the container before attempting removal or force remove
[root@VM-0-15-centos ~]# docker rm -f 213193490a95 #第一种 ,强制删除运行中的容器
213193490a95
[root@VM-0-15-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69099af40517 tomcat "catalina.sh run" 14 minutes ago Up 14 minutes 0.0.0.0:8888->8080/tcp vigilant_lichterman
[root@VM-0-15-centos ~]# docker stop 69099af40517 #第二种, 先停止容器,再进行删除
69099af40517
[root@VM-0-15-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@VM-0-15-centos ~]# docker ps -a #查看已停止的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69099af40517 tomcat "catalina.sh run" 15 minutes ago Exited (143) 14 seconds ago vigilant_lichterman
c813e68f37cf tomcat "catalina.sh run" 31 minutes ago Exited (130) 15 minutes ago cranky_snyder
7a32b4724222 tomcat "catalina.sh run" 33 minutes ago Exited (130) 32 minutes ago stupefied_agnesi
3d645031e0e2 hello-world "/hello" 20 hours ago Exited (0) 20 hours ago serene_wilson
[root@VM-0-15-centos ~]# docker rm 69099af40517#删除容器
69099af40517
[root@VM-0-15-centos ~]#
2、删除镜像
[root@VM-0-15-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b882bc1fb5bd tomcat "catalina.sh run" 19 seconds ago Up 17 seconds 8080/tcp thirsty_haslett
[root@VM-0-15-centos ~]# docker images #查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 1722f5c2ea4e 3 days ago 668MB
hello-world latest bf756fb1ae65 13 months ago 13.3kB
[root@VM-0-15-centos ~]# docker rmi tomcat:latest #删除镜像,如果有容器在运行会报错
Error response from daemon: conflict: unable to remove repository reference "tomcat:latest" (must force) - container b882bc1fb5bd is using its referenced image 1722f5c2ea4e
[root@VM-0-15-centos ~]# docker rmi -f tomcat:latest #强制删除镜像,会删除镜像的reposttory和tag,当前镜像依旧存在,容器依然在运行
Untagged: tomcat:latest
Untagged: tomcat@sha256:e7bc48bd0b0c18db84e718769ac27c87f90f9ecb20b761700be0a016a7f840d2
[root@VM-0-15-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 1722f5c2ea4e 3 days ago 668MB
hello-world latest bf756fb1ae65 13 months ago 13.3kB
[root@VM-0-15-centos ~]# docker rmi -f 1722f5c2ea4e #通过镜像id删除镜像,如果有容器在运行则报错
Error response from daemon: conflict: unable to delete 1722f5c2ea4e (cannot be forced) - image is being used by running container b882bc1fb5bd
[root@VM-0-15-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b882bc1fb5bd 1722f5c2ea4e "catalina.sh run" 3 minutes ago Up 3 minutes 8080/tcp thirsty_haslett
[root@VM-0-15-centos ~]# docker rm -f b882bc1fb5bd
b882bc1fb5bd
[root@VM-0-15-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@VM-0-15-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 1722f5c2ea4e 3 days ago 668MB
hello-world latest bf756fb1ae65 13 months ago 13.3kB
[root@VM-0-15-centos ~]# docker rmi 1722f5c2ea4e #通过镜像id删除镜像,如果已经停止的容器未删除,则报错
Error response from daemon: conflict: unable to delete 1722f5c2ea4e (must be forced) - image is being used by stopped container 7a32b4724222
[root@VM-0-15-centos ~]# docker ps -a #查看停止运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7a32b4724222 1722f5c2ea4e "catalina.sh run" 2 hours ago Exited (130) 2 hours ago stupefied_agnesi
3d645031e0e2 hello-world "/hello" 21 hours ago Exited (0) 21 hours ago serene_wilson
[root@VM-0-15-centos ~]# docker rm 7a32b4724222
7a32b4724222
[root@VM-0-15-centos ~]# docker rmi 1722f5c2ea4e # 删除所有关联容器后,镜像删除成功
Deleted: sha256:1722f5c2ea4ee2149d08e48602cd9a85ead7f1ac59abdc7c78483b479af4458e
Deleted: sha256:d0a8b19dc2a2536c5df5c8e1cbbde2a57adcd478917b758ceab5b340f6e9065e
Deleted: sha256:77dbafc053decc4bd85be7eb743ff80203f6cfcfae3fd70ffad5c5553a7c7073
Deleted: sha256:9406881131610a34d957b835c3d33dfb5ea9d2e31425f773cfe55cfd43997948
Deleted: sha256:6216371d2ccbaf557de1f23966e285986a0e054121c6a45d6a48c46e24afc547
Deleted: sha256:d4b189eccefbe0342aeeda284f07182a214a44d3fe1f55afa9f51a8cb8baee4d
Deleted: sha256:c95970bd3292e930f4282018fea00f00c91312af66b95390b000b501f0150a92
Deleted: sha256:03b0292dbc6978fe1077f948ac07472a8cac23fb4c3cf92c76f5eb62891e3d5a
Deleted: sha256:19f2a825ed46bbf16a06d9d5185a0ac68196217f302e760abb4cbc3178b14cc1
Deleted: sha256:b4f0436e967b6b9b021d3ed900a5422da6d8fe8c17c51c7d7e4f9c105812f868
Deleted: sha256:4762552ad7d851a9901571428078281985074e5ddb806979dd7ad24748db4ca0
[root@VM-0-15-centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 13 months ago 13.3kB
[root@VM-0-15-centos ~]#
3、容器中命令
docker exec [it] 容器id 命令 #在容器中执行命令- exec 在对应容器中执行命令- it 采用交互方式执行命令
docker exec -it 容器id /bin/bash #在容器中开启bash终端接收后续命令
cat /proc/version #查看docker中linux系统版本
java -version #查看docker中jdk版本
exit #退出docker
/var/lib/docker #docker默认安装目录,镜像image 容器containers
4、容器的生命周期
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p3cvWHA4-1615042052652)(E:\资料\马士兵\笔记\linux\image\image-20210207000841089.png)]
5、Dockerfile构建镜像
- Dockerfile是一个包含用于组合镜像的命令的文本文档
- Docker通过读取Dockerfile中的指令按步自动生成镜像
- docker build -t 机构/镜像名<:tags> Dockerfile目录
- 如果不指定tags,则默认latest
FROM tomcat:latest #from 设置基准镜像
MAINTAINER sssss.com #maintainer 说明维护机构
WORKDIR /usr/local/tomcat/webapps #workdir 切换工作目录,如果不存在则新建
ADD docker-web ./docker-web #复制文件docker-web 到./docker-web,.代表当前目录,第一个docker-web为dockerfile同级目录中的,第二个为webapps下的,不存在则创建
[root@VM-0-15-centos first-dockerfile]# docker build -t sss.com/mywebapp:1.0 . # 构建docker容器,. 代表当前目录
Sending build context to Docker daemon 3.584kB
Step 1/4 : FROM tomcat:latest #从远程拉取tomcat并创建临时容器,临时容器只能用于镜像构建,不能直接运行---> 1722f5c2ea4e
Step 2/4 : MAINTAINER mashibing.com---> Running in 66da275cad28 #每一步,docker都会对当前运行环境做一个快照,即临时容器
Removing intermediate container 66da275cad28---> 6247c5aa1c36
Step 3/4 : WORKDIR /usr/local/tomcat/webapps---> Running in d45e92eeb872
Removing intermediate container d45e92eeb872---> 59c15f124229
Step 4/4 : ADD docker-web ./docker-web---> ed636238c6c4
Successfully built ed636238c6c4
Successfully tagged sss.com/mywebapp:1.0
[root@VM-0-15-centos first-dockerfile]#
6、docker两个特点:
镜像:只读
容器:可读写
docker特点:
- 按层堆叠:每一步都在上一步的基础上执行
- 系统快照:临时容器,构建过程中临时容器可重用
临时容器重用演示:
- 创建docker_layer/Dockerfile文件写入如下命令
FROM tomcat
RUN ["echo" , "aaaa"] #在控制台打印aaaa
RUN ["echo" , "bbbb"]
RUN ["echo" , "cccc"]
RUN ["echo" , "dddd"]
- 使用dockerfile创建镜像,观察打印
[root@VM-0-15-centos docker_layer]# docker build -t sss.com/docker_layer:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM tomcat---> 1722f5c2ea4e
Step 2/5 : RUN ["echo" , "aaaa"] #第一次创建镜像,会生成临时容器,打印aaaa bbbb---> Running in f5229a9d0a91
aaaa
Removing intermediate container f5229a9d0a91---> a542610f21ee
Step 3/5 : RUN ["echo" , "bbbb"]---> Running in 75d17aa0d857
bbbb
Removing intermediate container 75d17aa0d857---> 06757c93bbf9
Step 4/5 : RUN ["echo" , "cccc"]---> Running in 42e269263e6a
cccc
Removing intermediate container 42e269263e6a---> 39cd88be9cff
Step 5/5 : RUN ["echo" , "dddd"]---> Running in 7e4205fd62a6
dddd
Removing intermediate container 7e4205fd62a6---> d891adbf3c69
Successfully built d891adbf3c69
Successfully tagged sss.com/docker_layer:1.0
- 修改Dockerfile文件内容为
FROM tomcat
RUN ["echo" , "aaaa"] #在控制台打印aaaa
RUN ["echo" , "bbbb"]
RUN ["echo" , "eeee"]
RUN ["echo" , "ffff"]
- 构建镜像,查看打印
[root@VM-0-15-centos docker_layer]# docker build -t sss.com/docker_layer:1.1 .
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM tomcat---> 1722f5c2ea4e
Step 2/5 : RUN ["echo" , "aaaa"]---> Using cache #从缓存中获取容器,不会重新创建临时容器---> a542610f21ee
Step 3/5 : RUN ["echo" , "bbbb"]---> Using cache---> 06757c93bbf9
Step 4/5 : RUN ["echo" , "eeee"]---> Running in 389c8bc591f5
eeee
Removing intermediate container 389c8bc591f5---> 2f51e6f1886d
Step 5/5 : RUN ["echo" , "ffff"]---> Running in ce357911770f
ffff
Removing intermediate container ce357911770f---> dc8da2ec61d8
Successfully built dc8da2ec61d8
Successfully tagged sss.com/docker_layer:1.1
[root@VM-0-15-centos docker_layer]#
7、dockerfile基础命令
FROM #基于基准镜像
FROM centos #制作基准镜像(基于centos:lastest)
FROM scratch #不依赖任何基准镜像base image
FROM tomcat:9.0.22-jdk8-openjdk
#尽量使用官方提供的Base Image
LABEL & MAINTAINER #说明信息
MAINTAINER ssss.com #指明维护机构/个人
LABEL version="1.0" #没有具体的功能,描述文件关键信息,便于维护
LABEL description="描述信息"
WORKDIR #设置工作目录
WORKDIR /usr/local #如果目录不存在则自动创建,尽量使用绝对路径,文档清晰,便于维护
ADD & COPY #复制文件,大多数情况可以互相替换
ADD hello / #复制到根目录
ADD test.tar.gz / #添加到根目录并解压
ADD #除了复制,还具备添加远程文件的功能
ENV #设置环境常量,使用环境常量,可以提高程序的可维护性
ENV JAVA_HOME /usr/local/openjdk8
RUN ${JAVA_HOME}/bin/java -jar test.jar
RUN #在使用build构建镜像时执行
ENTRYPOINT #容器启动时执行
CMD #容器启动后执行默认的命令或参数
8、RUN 命令执行格式
RUN yum install -y vim #shell命令格式
RUN ["yum","install","-y","vim"] #Exec命令格式
* shell命令格式执行下,先开启一个子shell进程,执行命令,执行完毕后退回父进程,对父进程无影响
* Exec命令格式下,使用Exec进程替代当前进程,且保持PID不变,执行完毕后,直接退出,不会退回之前的进程
* 官方推荐Exec格式
9、ENTRYPOINT 与CMD命令
ENTRYPOINT #(入口点)一般用于在容器启动时执行命令#dockerfile中只有最后一个ENTRYPOINT会被执行
CMD #用于设置默认执行的命令#dockerfile中只有最后一个CMD会被执行,通ENTRYPOINT一样#当容器启动时附加指令,则CMD会被忽略,不会执行
ENTRYPOINT与CMD命令一般联合使用,先写ENTRYPOINT,再写CMD,CMD会拼接在ENTRYPOINT之后执行
eg:
#Dockerfile文件内容
FROM centos
RUN ["echo","image building!!!"]
ENTRYPOINT ["ps"]
CMD ["-ef"]#构建镜像
[root@localhost app]# docker build -t ttt/ttt .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos---> 300e315adb2f
Step 2/4 : RUN ["echo","image building!!!"] #镜像构建时执行RUN命令---> Running in 55370bf4e907
image building!!!
Removing intermediate container 55370bf4e907---> 5b3503b414c2
Step 3/4 : ENTRYPOINT ["ps"] ##ENTRYPOINT与CMD未执行---> Running in e65983f593a2
Removing intermediate container e65983f593a2---> d24272592601
Step 4/4 : CMD ["-ef"]---> Running in a6e279a5a505
Removing intermediate container a6e279a5a505---> b66d567dc004
Successfully built b66d567dc004
Successfully tagged ttt/ttt:latest
[root@localhost app]# #启动容器时执行ENTRYPOINT与CMD命令
[root@localhost app]# docker run b66d567dc004 #未附加指令,两个命令拼接执行
UID PID PPID C STIME TTY TIME CMD
root 1 0 2 23:30 ? 00:00:00 ps -ef
[root@localhost app]# docker run b66d567dc004 -aux #附加指令,CMD命令被替换
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 47532 1780 ? Rs 23:35 0:00 ps -aux
三、构建redis镜像
- 使用redis源码包构建镜像
#Dockerfile文件内容
FROM centos
RUN ["yum" , "install" , "-y" ,"gcc","gcc-c++","net-tools","make"]
#gcc,gcc-c++ c语言源代码编译包,用于编译redis源代码 ,make安装程序的必备组件
WORKDIR /usr/local
#切换工作目录
ADD redis-4.0.14.tar.gz .
#将redis压缩包解压到/usr/local目录下,压缩包在dockerfile同级目录下
WORKDIR /usr/local/redis-4.0.14/src
RUN make && make install
#编译并且安装redis
WORKDIR /usr/local/redis-4.0.14
ADD redis-7000.conf .
#将配置文件复制到/usr/local/redis-4.0.14目录下,配置文件在dockerfile同级目录
EXPOSE 7000
#暴露7000端口,给外部访问
CMD ["redis-server","redis-7000.conf"]
#使用redis-server可执行文件加载redis配置
#构建镜像
docker build -t lll.com/docker-redis .
#启动镜像
[root@localhost docker-redis]# docker run -p 7000:7000 -d lll.com/docker-redis
55dc60c8333ca885031d8e0ace49eeaf2d5ee55c3920c6c46b2f237a19fbb02e[root@localhost docker-redis]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55dc60c8333c lll.com/docker-redis "redis-server redis-…" About a minute ago Up About a minute 0.0.0.0:7000->7000/tcp competent_carson[root@localhost docker-redis]# docker exec -it 55dc60c8333c /bin/bash
[root@55dc60c8333c redis-4.0.14]# ls
00-RELEASENOTES CONTRIBUTING INSTALL Makefile deps redis.conf runtest-cluster sentinel.conf tests
BUGS COPYING MANIFESTO README.md redis-7000.conf runtest runtest-sentinel src utils
- 获取官方镜像
docker pull reids #获取最新版本的redis,需要其他版本可以去官网查询https://hub.docker.com/
四、容器间通信
1、 容器间的单向通信
- 同一个宿主机中的一个docker环境下,容器在创建时被分配虚拟ip,容器间互通互联;
- docker使用run命令可以轻松创建容器,分配新的虚拟IP,从而导致了虚拟IP 通信的局限性;
- 对不同容器进行命名,通过名称进行通信,由docker进行转发,解决虚拟IP通信的局限性。
单向通信配置
[root@localhost docker-redis]# docker run -d --name web tomcat #给容器命名为web
3dd70489b8675df004c1a52a5200b72ffcb8a9ebff44aa53d2c464acb4cf71d3[root@localhost docker-redis]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3dd70489b867 tomcat "catalina.sh run" 3 minutes ago Up 3 minutes 8080/tcp web
55dc60c8333c lll.com/docker-redis "redis-server redis-…" 29 minutes ago Up 29 minutes 0.0.0.0:7000->7000/tcp competent_carson、[root@localhost docker-redis]# docker run -d --name database -it centos /bin/bash #centos容器会直接退出,需要加/bin/bash #给容器命名为database
cc0dd1e66381ee7690cb2c2e8fa7246e142248d3ed2c0c2ae7a5c3a1792d4c40[root@localhost docker-redis]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc0dd1e66381 centos "/bin/bash" 5 seconds ago Up 4 seconds database
3dd70489b867 tomcat "catalina.sh run" 4 minutes ago Up 4 minutes 8080/tcp web
55dc60c8333c lll.com/docker-redis "redis-server redis-…" 30 minutes ago Up 30 minutes 0.0.0.0:7000->7000/tcp competent_carson[root@localhost docker-redis]# docker inspect cc0dd1e66381 #获取容器/镜像的元数据
##找到NetworkSettings:IPAddress 即: 容器的虚拟IP 172.17.0.1#进入web容器下访问database容器IP,可以ping通
[root@localhost docker-redis]# docker exec -it 3dd70489b867 /bin/bashroot@3dd70489b867:/usr/local/tomcat# ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1) 56(84) bytes of data.
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.220 ms
64 bytes from 172.17.0.1: icmp_seq=2 ttl=64 time=0.054 ms#使用database容器名,则无法ping通
root@3dd70489b867:/usr/local/tomcat# ping database#退出容器
root@3dd70489b867:/usr/local/tomcat# exit
exit
[root@localhost docker-redis]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc0dd1e66381 centos "/bin/bash" 21 minutes ago Up 21 minutes database
3dd70489b867 tomcat "catalina.sh run" 26 minutes ago Up 26 minutes 8080/tcp web
55dc60c8333c lll.com/docker-redis "redis-server redis-…" About an hour ago Up About an hour 0.0.0.0:7000->7000/tcp competent_carson
#删除web容器
[root@localhost docker-redis]# docker rm -f 3dd70489b867
3dd70489b867
#使用link命令将web容器链接到database容器上
[root@localhost docker-redis]# docker run -d --name web --link database tomcat
9cfbf913d65bfa2866b17221a2ac84ec245da402e0cca73bb6d1f17d0668b68a[root@localhost docker-redis]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9cfbf913d65b tomcat "catalina.sh run" 2 minutes ago Up 2 minutes 8080/tcp web
cc0dd1e66381 centos "/bin/bash" 27 minutes ago Up 27 minutes database
55dc60c8333c lll.com/docker-redis "redis-server redis-…" About an hour ago Up About an hour 0.0.0.0:7000->7000/tcp competent_carson
#进入web容器
[root@localhost docker-redis]# docker exec -it 9cfbf913d65b /bin/bash
#使用容器名称即可ping通,实现单向通信
root@9cfbf913d65b:/usr/local/tomcat# ping database
PING database (172.17.0.4) 56(84) bytes of data.
64 bytes from database (172.17.0.4): icmp_seq=1 ttl=64 time=0.270 ms
64 bytes from database (172.17.0.4): icmp_seq=2 ttl=64 time=0.061 ms
2、利用网桥(Bridge)实现容器间的双向通信
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tMAVQef7-1615042052656)(E:\资料\马士兵\笔记\linux\image\网桥.png)]
网桥(虚拟网卡):实现容器与外部网络的通信,可以对容器从网络层面进行分组(绑定不同的网桥)
[root@localhost ~]# docker network ls #查看当前dockers 网络服务清单,bridge为默认网桥
NETWORK ID NAME DRIVER SCOPE
3f543a8fc4f6 bridge bridge local
8f0903979d08 host host local
38ed618d2b02 none null local
#创建新的网桥实现容器间的互联互通
[root@localhost ~]# docker network create -d bridge my-bridge
fdb9b9ac85a6534748d63fa9732a408b2581a990f0abbc4d80c7fda87095ce7c[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3f543a8fc4f6 bridge bridge local
8f0903979d08 host host local
fdb9b9ac85a6 my-bridge bridge local
38ed618d2b02 none null local
[root@localhost ~]# [root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75f24fc8dfac centos "/bin/bash" 8 seconds ago Up 5 seconds database
928710251b0c tomcat "catalina.sh run" 42 seconds ago Up 38 seconds 8080/tcp web#将容器绑定到新创建的网桥上
[root@localhost /]# docker network connect my-bridge web
[root@localhost /]# docker network connect my-bridge database
#容器间即可实现双向通信
[root@localhost /]# docker exec -it 928710251b0c /bin/bash
root@928710251b0c:/usr/local/tomcat# ping database
PING database (172.18.0.3) 56(84) bytes of data.
64 bytes from database.my-bridge (172.18.0.3): icmp_seq=1 ttl=64 time=7.56 ms
64 bytes from database.my-bridge (172.18.0.3): icmp_seq=2 ttl=64 time=0.121 ms
64 bytes from database.my-bridge (172.18.0.3): icmp_seq=3 ttl=64 time=0.061 ms
3、容器间的数据共享(Volume)
Volume:数据卷
场景:当多个容器需要使用相同文件时,若需要修改文件,则要修改每个容器中的文件,维护比较麻烦
解决:使用volume实现数据共享
- 在宿主机中开辟一个文件空间,用于保存共享文件;
- 在容器中直接绑定该空间,实现容器间文件共享;
- 当修改文件时,直接修改宿主机文件即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MeIPNVIl-1615042052658)(E:\资料\马士兵\笔记\linux\image\volume数据共享.png)]
实现一:使用 -v 命令挂载宿主机目录
#命令格式
docker run --name 容器名 -v 宿主机文件路径:容器内挂载路径 镜像名#实例
docker run --name t1 -v /usr/webapps:/usr/local/tomcat/webapps tomcat#问题
使用这种方式时,每次都需要维护宿主机与容器的挂载路径,大量容器配置时容易出错,不太方便
实现二:使用 --volumes-from 共享容器内挂载点
#创建共享容器,配置挂载信息,/bin/true相当于占位符,没有具体含义
docker create --name webpage -v /usr/webapps:/usr/local/tomcat/webapps tomcat /bin/true
#创建容器,使用共享容器挂载
docker run --volumes-from webpage --name t1 -d tomcat
五、Docker-compose容器编排工具
- Docker Compose :单机多容器部署工具,只支持单机部署
- 使用yml配置多容器如何部署
- WIN/MAC默认提供了Docker Compose,Linux 需要安装
- 官网: https://docs.docker.com/compose/
linux环境安装dockers compose
#命令来自官方文档
#下载并安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#给文件夹授权
sudo chmod +x /usr/local/bin/docker-compose
#查看安装版本,验证是否安装成功、
docker-compose -version
安装WordPress开源博客,来源于官方文档
进入Overview of Docker Compose目录,搜索workpress,点击进入,即可看到安装文档;
#创建一个目录文件,用于存放docker-compose.yml文件
[root@localhost images]# mkdir my_workpress
#进入新建的目录文件,编辑配置文件
[root@localhost my_workpress]# vi docker-compose.yml
#下载并启动workpress
[root@localhost my_workpress]# docker-compose up -d
Creating network "my_workpress_default" with the default driver
Creating volume "my_workpress_db_data" with default driver
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
a076a628af6f: Pull complete
.....
426d16d4eb4f: Pull complete
Digest: sha256:2d5f306e039a637bd86d9d1cfc1b465c987898e2784e4279754b9d3c2737121b
Status: Downloaded newer image for wordpress:latest
Creating my_workpress_db_1 ... done #数据库
Creating my_workpress_wordpress_1 ... done #软件
#端口映射为8000,登录地址http://ip:8000
[root@localhost my_workpress]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a436aad0004 wordpress:latest "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:8000->80/tcp my_workpress_wordpress_1
af57a59c7238 mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 3306/tcp, 33060/tcp my_workpress_db_1
#docker-cpmpose配置文件内容
version: "3.9"services:db:image: mysql:5.7volumes:- db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: somewordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpresswordpress:depends_on:- dbimage: wordpress:latestports:- "8000:80"restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpressWORDPRESS_DB_NAME: wordpress
volumes:db_data: {}
应用实战
部署应用程序及mysql数据库容器
#应用程序dockerfile文件内容
FROM openjdk:8u222-jre
WORKDIR /usr/local/bsbdj
COPY bsbdj.jar .
COPY application.yml .
COPY application-dev.yml .
EXPOSE 80
CMD ["java","-jar","bsbdj.jar"]
#mysql容器dockerfile文件内容
FROM mysql:5.7
#mysql5.7镜像提供的初始化数据库的脚本文件存放目录,不能修改,详细配置参考hub.docker.com官方文档
WORKDIR /docker-entrypoint-initdb.d
#sql文件复制到脚本目录,mysql会自动进行初始化数据库操作
ADD init-db.sql .
#docker-compose.yml文件内容,配置文件名不能修改
#docker-compose版本号
version: '3.3'
#配置服务列表
services:
#服务名,自己随便起db: #使用指定目录下的dockerfile文件构建镜像并启动容器build: ./bsbdj-db/#当容器宕机时,自动重新启动一个容器restart: always#配置环境变量environment:MYSQL_ROOT_PASSWORD: rootapp:build: ./bsbdj-app/#配置依赖,当存在依赖关系时,被依赖的服务需要先进行配置depends_on:- db#配置端口映射ports:- "80:80"restart: always
#构建镜像
docker build -t bsbdj.com/bsbdj-app .
docker build -t babdj.com/bsbdj-db .
#启动app
docker run -d bsbdj.com/babdj-app
#启动mysql容器,-e 配置环境变量,MYSQL_ROOT_PASSWORD指定root账户密码
docker run -d -e MYSQL_ROOT_PASSWORD=root bsbdj.com/bsbdj-db
#进入mysql容器,验证mysql是否初始化成功
[root@localhost bsbdj-db]# docker exec -it c2904fd5d2d5 /bin/bash
root@c2904fd5d2d5:/docker-entrypoint-initdb.d# mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.33 MySQL Community Server (GPL)Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
#使用use命令切换到刚才初始化的数据库,没有报错则初始化成功
mysql> use bsbdj
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
#查看表结构
mysql> show tables;
#使用docker-compose创建容器并运行容器
docker-compose up
#后台运行
docker-compose up -d
#查看日志
docker-compose logs
docker-compose logs 服务名称
#停止容器
docker-compose down
#启动完后会出现两个容器,容器名称bsbdj_app_1,bsbdj_db_1,命名规则:目录名_服务名_容器编号
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
332fc012fe50 bsbdj_app "java -jar bsbdj.jar" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp bsbdj_app_1
388ee885e05a bsbdj_db "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp bsbdj_db_1[root@localhost ~]#
#app链接数据库时,只需要将配置文件中的ip地址改为db(docker-compose.yml中配置的数据库服务名)即可
docker相关异常
- 异常一
[root@docker01 ~]# docker run centos
docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
解决方案
修改docker镜像源:linux
docker默认的源为国外官方源,下载速度较慢,可改成国内
方案一
#修改或新增 /etc/docker/daemon.json 本人使用此方案解决了问题,方案二未验证
[root@docker01 ~]# vi /etc/docker/daemon.json
{"registry-mirrors": ["http://hub-mirror.c.163.com","https://pee6w651.mirror.aliyuncs.com"]
}[root@docker01 ~]# systemctl restart docker.service
方案二
#修改或新增 /etc/sysconfig/docker,在OPTIONS变量后追加参数 --registry- mirror=https://docker.mirrors.ustc.edu.cnspa
[root@docker01 ~]# vi /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --registry-mirror=https://docker.mirrors.ustc.edu.cn'
Docker国内源说明:restDocker 官方中国区:https://registry.docker-cn.comcode网易:http://hub-mirror.c.163.comblog中国科技大学:https://docker.mirrors.ustc.edu.cnit阿里云:https://pee6w651.mirror.aliyuncs.com
随笔——Docker学习笔记相关推荐
- Docker:学习笔记(1)——基础概念
Docker:学习笔记(1)--基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...
- Docker学习笔记 之 Docker安装配置使用
简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare met ...
- docker学习笔记(四)使用docker搭建环境
参考:汤小洋老师的教学视频 docker学习笔记(一)[docker 介绍.卸载.安装.配置加速] docker学习笔记(二)docker常用命令 docker学习笔记(三)镜像 docker学习笔记 ...
- docker学习笔记(二)docker常用命令
参考:汤小洋老师的教学视频 docker学习笔记(一)[docker 介绍.卸载.安装.配置加速] docker学习笔记(三)镜像 docker学习笔记(四)使用docker搭建环境 docker学习 ...
- docker学习笔记(三)镜像
参考:汤小洋老师的教学视频 docker学习笔记(一)[docker 介绍.卸载.安装.配置加速] docker学习笔记(二)docker常用命令 docker学习笔记(四)使用docker搭建环境 ...
- docker学习笔记(五)如何创建自己的阿里云镜像仓库(这是2021版的阿里云教程)
参考:汤小洋老师的教学视频 docker学习笔记(一)[docker 介绍.卸载.安装.配置加速] docker学习笔记(二)docker常用命令 docker学习笔记(三)镜像 docker学习笔记 ...
- 【长篇博文】Docker学习笔记与深度学习环境的搭建和部署(二)
长篇博文记录学习流程不容易,请关注.转发.点赞.评论,谢谢! 上一篇文章:Docker学习笔记与深度学习环境的搭建和部署(一) 文章末尾附加nvidia455.23.cuda11.1.cudnn8.0 ...
- 狂神 Docker学习笔记 从基础到进阶 一步到位
Docker 学习笔记 感谢狂神的分享.附上B站视频链接. https://www.bilibili.com/video/BV1og4y1q7M4?from=search&seid=92256 ...
- 开源的容器虚拟化平台Docker学习笔记,个人私藏分享,不谢!
一.Docker 简介 Docker 两个主要部件: Docker: 开源的容器虚拟化平台 Docker Hub: 用于分享.管理 Docker 容器的 Docker SaaS 平台 -- Docke ...
最新文章
- 下面哪一c++ 语言表达式不能正确表示数学关系ax≤b,C++经典选择题(一)
- ant编译重设property的值
- WWF系列之----关于Host与WorkflowInstance之间的通讯
- sprintf()函数的使用
- P1152 欢乐的跳( python3实现)
- java 课后习题 删除奇数元素下标 然后再删除值为奇数的下标
- php 判断点在多边形内,PHP判断点是否在多边形区域内外
- oracle过程包保存乱码_这些火遍网络的哆啦A梦表情包,你知道出处吗?
- parameterType 属性、typeAliases 别名
- 男朋友就是要这个样子的
- Android 的网络编程
- 什么会造成os.chdir not nonetype_Python有什么不为人知的坑?
- SCVMM 2012 R2---添加Hyper-V虚拟机
- 14.msql_python
- 前端地图之色斑图渲染(数据格式为.tif的栅格数据)(一)——以leaflet为例
- java 查看native方法_Java-如何查看java里的native方法?
- office2016图标显示异常,但是文档可以正常打开解决办法
- Oracle 19c 新特性一览
- 我国云计算中心大盘点
- 常成员函数和静态成员函数
热门文章
- STC系列51单片机在Windows下的开发
- nvidia显卡相关信息查询
- 内容付费时代,你愿意为文章付费吗?
- 华工计算机工程学院,计算机工程学院赴华工兄弟学院交流学习
- webscarab fuzz testing
- matlab散点图加图例,将图例添加到图
- MATLAB Simulink
- MathWorks 中国
- 【它山之玉】人生的自然法则-科学网马臻
- NGR/R8-PEG-ICG,肿瘤新生血管靶向肽NGR/穿膜肽R8-聚乙二醇-吲哚菁绿
- 【阶段总结】研一上学期总结
- ORA-00020: maximum number of processes (xxxx) exceeded 报错解决方法