一、安装
1.需要的安装包
yum install -y yum-utils
2.设置阿里云镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.更新yum软件包索引
yum makecache fast
4.安装Docker引擎
yum install docker-ce docker-ce-cli containerd.io
5.启动Docker
sudo systemctl start docker
查看是否安装成功
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker version
Client: Docker Engine - Community
Version: 20.10.9
API version: 1.41
Go version: go1.16.8
Git commit: c2ea9bc
Built: Mon Oct 4 16:08:14 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?hello-world
[root@iZbp12fj4dxm8z5uofcvshZ ~]# systemctl start docker
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker run hello-worldHello from Docker!
This message shows that your installation appears to be working correctly.查看下载的hello-world镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 4 weeks ago 13.3kB卸载Docker
1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
2. 删除资源
rm -rf /var/lib/docker
/var/lib/docker 是docker的默认工作路径
阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' {
"registry-mirrors": ["https://w6f5mrbn.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
关于这样一个报错信息的解决
[root@iZbp12fj4dxm8z5uofcvshZ ~]# systemctl start docker
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.解决办法!
[root@iZbp12fj4dxm8z5uofcvshZ ~]# mv /etc/docker/daemon.json /etc/docker/daemon.conf
二、Docker的常用命令
(1)帮助命令
docker info 显示Docker的系统信息,包括镜像和容器的数量
docker --help 帮助命令
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.6.3-docker)
scan: Docker Scan (Docker Inc., v0.8.0)Server:
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 1
Server Version: 20.10.9(2)镜像命令
docker images 查看所有本地的主机上的镜像
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 4 weeks ago 13.3kBREPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
Options:
-a, --all 列出所有镜像
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet 只显示镜像的iddocker search 搜索镜像
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker search mysql
NAME DEscriptION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11603 [OK]
mariadb MariaDB Server is a high performing open sou… 4414 [OK]docker pull 镜像名 下载镜像
docker pull mysql:5.7 指定版本下载
docker rmi 删除镜像
docker rmi -f 镜像id 删除指定的镜像
(3)容器命令
docker pull centos 下载一个centos镜像
docker run [可选参数] image
参数说明:
--name="Name" 容器名字,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器端口
-p 主机端口:容器端口
-P 随机指定端口
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker run -it centos /bin/bash
[root@9f3688e1173b /]# ls 查看容器内的centos
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var[root@9f3688e1173b /]# exit 从容器中的centos退回到主机
Ctrl+P+Q 退出容器,但是容器继续运行
docker ps 列出当前正在运行的容器
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker ps
ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESdocker ps -a 列出当前正在运行的容器,并且显示历史运行过的容器[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker ps -a
ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9f3688e1173b centos "/bin/bash" 8 minutes ago Exited (0) 4 minutes ago cranky_hoover
dceccbdd68ef hello-world "/hello" 3 days ago Exited (0) 3 days ago hungry_feynman
docker rm 容器id 删除指定容器,不能删除正在运行的容器
docker rm -f 容器id 强制删除
docker rm -f $(docker ps -aq) 删除全部(根据id查询出所有)
docker start 容器id 启动容器
docker restart 容器id 重启容器
docker stop 容器id 停止当前正在运行的容器
docker kill 容器id 强制停止当前容器
(4)常用其它命令
docker run -d centos(镜像名)后台启动容器
注:docker 容器使用后台运行,就必须要有一个前台进程,否则docker发现没有应用,就会自动停止
docker logs 参数 查看日志
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
-n, --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:37Z) or relative (e.g. 42m for 42 minutes)docker top 容器id 查看容器中进程信息
docker inspect 参数 查看镜像的元数据
docker exec -it 容器id bashShell 进入当前正在运行的容器,通常容器都是使用后台方式运行的,需要进入容器,修改一些配置(进入容器后开启一个新的终端,可以在里面进行一些操作)
docker attach 容器id 进入容器正在执行的终端,不会启动新的进程
docker cp 容器id:容器内路径 目的主机路径 从容器内拷贝文件到主机上
三、练习
(1)Docker安装Nginx
1.搜索镜像
2.下载镜像
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker pull nginx
3.运行测试
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 87a94228f133 2 weeks ago 133MB hello-world latest feb5d9fea6a5 5 weeks ago 13.3kB centos latest 5d0da3dc9764 6 weeks ago 231MB-d 后台运行
--name 给容器起名字
-p 宿主机端口(外网访问):容器内部端口(内部映射)
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker run -d --name nginx01 -p 3344:80 nginx
60906fddb6e5f0fb4311081302486b97cc1e85ef8dace6067227d4d97b6967b3[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 60906fddb6e5 nginx "/docker-entrypoint.…" about a minute ago Up about a minute 0.0.0.0:3344->80/tcp nginx01(2)Docker部署Tomcat
docker run -it --rm tomcat:9.0 一般用来测试,用完即删
正常使用
docker pull tomcat:9.0
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat 9.0 43e421a14aec 8 days ago 680MB nginx latest 87a94228f133 2 weeks ago 133MB hello-world latest feb5d9fea6a5 5 weeks ago 13.3kB centos latest 5d0da3dc9764 6 weeks ago 231MBdocker run -d --name tomcat01 -p 3355:8080 tomcat
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker exec -it tomcat01 /bin/bash
root@c2e73e609caf:/usr/local/tomcat/webapps# ls
发现webapps目录下是空的,原因:阿里云镜像的问题,默认是最小的镜像,所有不必要的都剔除掉,只保证最小可运行的环境
四、可视化管理工具
portainer Docker图形化界面管理工具,提供一个后台面板供我们操作
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
docker run -d -p 9000:9000
--restart=always
-v /var/run/docker.sock:/var/run/docker.sock
--name prtainer-test
portainer/portainer
五、 commit镜像
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名
测试:
docker run -it -p 8081:8080 tomcat 启动Tomcat
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker exec -it 896dc475d77e /bin/bash root@896dc475d77e:/usr/local/tomcat# cd webapps root@896dc475d77e:/usr/local/tomcat/webapps# ls root@896dc475d77e:/usr/local/tomcat/webapps#root@896dc475d77e:/usr/local/tomcat# cp -r webapps.dist/* webapps root@896dc475d77e:/usr/local/tomcat# cd webapps root@896dc475d77e:/usr/local/tomcat/webapps# ls ROOT docs examples host-manager manager将我们操作过(修改过)的容器通过commit命令提交为一个镜像!以后就可以使用我们修改过的镜像了
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker commit -a="chen" -m="add webapps app" 896dc475d77e tomcat01:1.0 [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat01 1.0 d41ab156dc63 21 seconds ago 684MB tomcat 9.0 43e421a14aec 11 days ago 680MB tomcat latest b0e0b0a92cf9 11 days ago 680MB nginx latest 87a94228f133 3 weeks ago 133MB hello-world latest feb5d9fea6a5 5 weeks ago 13.3kB centos latest 5d0da3dc9764 6 weeks ago 231MB portainer/portainer latest 580c0e4e98b0 7 months ago 79.1MB
六、容器数据卷
试想一下,如果数据都在容器中,一旦我们容器删除,数据就会丢失!因此我们怎么解决数据持久化的问题?我们怎样才能将MySQL数据库中的数据存储在本地?
解决办法是使用数据卷
方式一:直接使用命令来挂载
[root@iZbp12fj4dxm8z5uofcvshZ home]# docker run -it -v /home/ceshi:/home centos /bin/bash
解释:Linux本机目录和容器目录形成映射
/home/ceshi Linux本机目录 /home 容器目录,我们先将两个目录清空
[root@iZbp12fj4dxm8z5uofcvshZ home]# ls ceshi chenhong webJar www[root@48bca8c2b0e6 /]# cd /home [root@48bca8c2b0e6 home]# ls [root@48bca8c2b0e6 home]#docker inspect 容器id 可以查看挂载信息
[root@iZbp12fj4dxm8z5uofcvshZ home]# docker inspect 48bca8c2b0e6
"Mounts": [ { "Type": "bind", "Source": "/home/ceshi", "Destination": "/home", "Mode": "", "RW": true, "Propagation": "rprivate" } ]
可以看到在容器内的操作会同步到本机,在本机的操作也会同步到容器,另外如果centos容器停止运行,数据还会同步吗?可以看到在本机上修改test.java文件,此时centos容器的状态是停止运行的,但是修改后的内容也会同步到centos容器
[root@iZbp12fj4dxm8z5uofcvshZ ceshi]# vim test.java hello,linux再次启动centos容器,发现容器内的数据仍然是同步的
[root@iZbp12fj4dxm8z5uofcvshZ home]# docker start bce3dea65d52 bce3dea65d52 [root@iZbp12fj4dxm8z5uofcvshZ home]# docker attach bce3dea65d52 [root@bce3dea65d52 /]# cd home/ [root@bce3dea65d52 home]# ls test.java [root@bce3dea65d52 home]# cat test.java hello,linux练习:MySQL数据同步
[root@iZbp12fj4dxm8z5uofcvshZ home]# docker pull mysql:5.7启动容器时,需要做数据挂载!
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名称
[root@iZbp12fj4dxm8z5uofcvshZ ~]# 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 mysql01 mysql:5.7 01f301811d101bde28643fee047daf6f55a4c2b57a4575a24a2aacfd8ff26735
具名挂载和匿名挂载
1.匿名挂载
-v 容器内路径(不指定主机路径)
[root@iZbp12fj4dxm8z5uofcvshZ data]# docker run -d -P --name nginx02 -v /etc/nginx nginx2.具名挂载,通过 -v 卷名:容器内路径
[root@iZbp12fj4dxm8z5uofcvshZ data]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx c7fb3fb296ff279e63d9e18970d71dc147512870e9b8137beaf01a675549e204 [root@iZbp12fj4dxm8z5uofcvshZ data]# docker volume ls DRIVER VOLUME NAME local 717861c93df3a32cf8cb30b7642e484b084a0e3c3ae771e82673da378615561d local juming-nginx查看挂载路径(本机)
[root@iZbp12fj4dxm8z5uofcvshZ data]# docker volume inspect juming-nginx [ { "CreatedAt": "2021-11-03T21:49:37+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data", "Name": "juming-nginx", "Options": null, "Scope": "local" } ] [root@iZbp12fj4dxm8z5uofcvshZ docker]# cd /var/lib/docker [root@iZbp12fj4dxm8z5uofcvshZ docker]# ls buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes扩展:通过 -v 容器内路径:ro rw 改变读写权限
ro 只读,容器内部无法操作
rw 可读可写
[root@iZbp12fj4dxm8z5uofcvshZ volumes]# docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:ro nginx [root@iZbp12fj4dxm8z5uofcvshZ volumes]# docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:rw nginx方式二:使用Dockerfile来构建docker镜像
Dockerfile就是用来构建docker镜像的构建文件,里面写的是命令脚本!
[root@iZbp12fj4dxm8z5uofcvshZ home]# ls ceshi chenhong mysql webJar www [root@iZbp12fj4dxm8z5uofcvshZ home]# mkdir docker-test-volume [root@iZbp12fj4dxm8z5uofcvshZ home]# ls ceshi chenhong docker-test-volume mysql webJar www [root@iZbp12fj4dxm8z5uofcvshZ docker-test-volume]# vim dockerfile [root@iZbp12fj4dxm8z5uofcvshZ docker-test-volume]# cat dockerfile FROM centos VOLUME ["volume01,"volume02"] CMD echo "----end----" CMd /bin/bash构建步骤:
1.编写一个dockerfile文件
2.docker build 构建成为一个镜像
3.docker run 运行镜像
4.docker push 发布镜像(DockerHub、阿里云镜像仓库)
关于构建过程中需要用到的一些指令(写在dockerfile文件中)
1.每个保留关键字(指令)都必须是大写字母
2.执行顺序:从上到下
3.#符号表示注释
4.每一条指令代表一个镜像层
5.dockerfile是面向开发的,在今后的工作中如果要发布项目,构建镜像,就需要编写dockerfile文件
常用指令介绍:
FROM 指定基础镜像
MAINTAINER 指定维护者信息,姓名+邮箱
RUN 镜像构建的时候需要运行的命令
ADD 添加内容,比如Tomcat、MySQL
WORKDIR 设置镜像的工作目录
VOLUME 挂载的目录路径
EXPOSE 指定对外的端口
CMD 指定这个容器启动的时候要运行的命令,只有最后一个会生效
ENTRYPOINT 追加CMD命令
COPY 将文件拷贝到镜像中
ENV 构建的时候设置环境
练习1:创建一个自己的centos
创建一个文件目录dockerfile,创建文件dockerfile-mycentos
[root@iZbp12fj4dxm8z5uofcvshZ home]# mkdir dockerfile [root@iZbp12fj4dxm8z5uofcvshZ home]# ls ceshi chenhong dockerfile docker-test-volume mysql webJar www[root@iZbp12fj4dxm8z5uofcvshZ dockerfile]# vim dockerfile-mycentos [root@iZbp12fj4dxm8z5uofcvshZ dockerfile]# cat dockerfile-mycentos FROM centos MAINTAINER chen<1424861923@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[root@iZbp12fj4dxm8z5uofcvshZ dockerfile]# docker build -f dockerfile-mycentos -t firstcentos:0.1 . Sending build context to Docker daemon 2.048kB Step 1/10 : FROM centos ---> 5d0da3dc9764 Step 2/10 : MAINTAINER chen<1424861923@qq.com> ---> Running in 506ee5335a51 Removing intermediate container 506ee5335a51 ---> 38a73673f741 Step 3/10 : ENV MYPATH /usr/local ---> Running in 0c3a1a05059a Removing intermediate container 0c3a1a05059a ---> 60fa9fea6bbd Step 4/10 : WORKDIR $MYPATH ---> Running in c9df318d0bf6 Removing intermediate container c9df318d0bf6 ---> 9a7d9361e9b7 Step 5/10 : RUN yum -y install vim ---> Running in c99da7db36db ...... Step 7/10 : EXPOSE 80 ---> Running in 47ad4bd722b9 Removing intermediate container 47ad4bd722b9 ---> e15ad626d22e Step 8/10 : CMD echo $MYPATH ---> Running in d8ee05b62f0c Removing intermediate container d8ee05b62f0c ---> 29dcd797c4e7 Step 9/10 : CMD echo "----end----" ---> Running in ebaf0c94da70 Removing intermediate container ebaf0c94da70 ---> fdd7602157cf Step 10/10 : CMD /bin/bash ---> Running in 0ef884922ec4 Removing intermediate container 0ef884922ec4 ---> 3b37384a8a11 Successfully built 3b37384a8a11 Successfully tagged firstcentos:0.1测试运行
[root@iZbp12fj4dxm8z5uofcvshZ dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE firstcentos 0.1 3b37384a8a11 3 minutes ago 340MB [root@iZbp12fj4dxm8z5uofcvshZ dockerfile]# docker run -it firstcentos:0.1 [root@9705261046e3 local]# pwd /usr/local自己构建的镜像可以对基础镜像进行增强,如:基础镜像中不能使用的命令(vim、ipconfig)在我们自己构建的镜像中都可以使用
查看变更历史
[root@iZbp12fj4dxm8z5uofcvshZ dockerfile]# docker history 3b37384a8a11 IMAGE CREATED CREATED BY SIZE COMMENT 3b37384a8a11 10 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B fdd7602157cf 10 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B 29dcd797c4e7 10 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B e15ad626d22e 10 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B 7347412a2f6c 10 minutes ago /bin/sh -c yum -y install net-tools 33.7MB de6acfb60692 10 minutes ago /bin/sh -c yum -y install vim 75MB 9a7d9361e9b7 11 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B 60fa9fea6bbd 11 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B 38a73673f741 11 minutes ago /bin/sh -c #(nop) MAINTAINER chen<142486192… 0B 5d0da3dc9764 7 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B7 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B 7 weeks ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB 练习2:Tomcat镜像
1.准备镜像文件tomcat压缩包,jdk的压缩包
[root@iZbp12fj4dxm8z5uofcvshZ ~]# cd /home [root@iZbp12fj4dxm8z5uofcvshZ home]# ls ceshi chenhong dockerfile docker-test-volume mysql webJar www [root@iZbp12fj4dxm8z5uofcvshZ home]# cd chenhong/ [root@iZbp12fj4dxm8z5uofcvshZ chenhong]# ls Tomcat [root@iZbp12fj4dxm8z5uofcvshZ chenhong]# cd Tomcat [root@iZbp12fj4dxm8z5uofcvshZ Tomcat]# ls apache-tomcat-9.0.54.tar.gz jdk-8u121-linux-x64.tar.gz [root@iZbp12fj4dxm8z5uofcvshZ Tomcat]# touch readme.txt [root@iZbp12fj4dxm8z5uofcvshZ Tomcat]# ls apache-tomcat-9.0.54.tar.gz Dockerfile jdk-8u121-linux-x64.tar.gz readme.txt2.编写dockerfile文件,命名Dockerfile
FROM centos MAINTAINER chen<1424861923@qq.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u121-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.54.tar.gz /usr/local/ RUN yum install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_121 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.54 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.54 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.54/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.54/bin/logs/catalina.out3.构建镜像
[root@iZbp12fj4dxm8z5uofcvshZ Tomcat]# docker build -t mtomcat . Sending build context to Docker daemon 194.8MB Step 1/15 : FROM centos ---> 5d0da3dc9764 Step 2/15 : MAINTAINER chen<1424861923@qq.com> ---> Using cache ---> 38a73673f741 Step 3/15 : COPY readme.txt /usr/local/readme.txt ...... Step 15/15 : CMD /usr/local/apache-tomcat-9.0.54/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.54/bin/logs/catalina.out ---> Running in 1109fe46afd6 Removing intermediate container 1109fe46afd6 ---> 519d4c060797 Successfully built 519d4c060797 Successfully tagged mtomcat:latest4.启动测试
[root@iZbp12fj4dxm8z5uofcvshZ Tomcat]# docker run -d -p 8081:8080 --name chenhongtomcat -v /home/chenhong/Tomcat/test:/usr/local/apache-tomcat-9.0.54/webapps/test -v /home/chenhong/Tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.54/logs mtomcat 2c77dad64999082610d860c3e84f9302d6824972ff1a5b6e94a144905e856911 [root@iZbp12fj4dxm8z5uofcvshZ Tomcat]# docker exec -it 2c77dad6499908 /bin/bash [root@2c77dad64999 local]# ls aegis apache-tomcat-9.0.54 bin etc games include jdk1.8.0_121 lib lib64 libexec readme.txt sbin share src [root@2c77dad64999 local]# cd apache-tomcat-9.0.54/ [root@2c77dad64999 apache-tomcat-9.0.54]# ls -l total 148 -rw-r----- 1 root root 18970 Sep 28 13:51 BUILDING.txt -rw-r----- 1 root root 6210 Sep 28 13:51 CONTRIBUTING.md -rw-r----- 1 root root 57092 Sep 28 13:51 LICENSE -rw-r----- 1 root root 2333 Sep 28 13:51 NOTICE -rw-r----- 1 root root 3372 Sep 28 13:51 README.md -rw-r----- 1 root root 6898 Sep 28 13:51 RELEASE-NOTES -rw-r----- 1 root root 16507 Sep 28 13:51 RUNNING.txt drwxr-x--- 2 root root 4096 Sep 28 13:51 bin drwx------ 1 root root 4096 Nov 5 06:17 conf drwxr-x--- 2 root root 4096 Sep 28 13:51 lib drwxr-xr-x 2 root root 4096 Nov 5 06:17 logs drwxr-x--- 2 root root 4096 Sep 28 13:51 temp drwxr-x--- 1 root root 4096 Nov 5 06:17 webapps drwxr-x--- 1 root root 4096 Nov 5 06:17 work在Linux本机上创建一个很简单的web项目,内容会自动同步到容器中,因为使用了挂载
[root@iZbp12fj4dxm8z5uofcvshZ test]# mkdir WEB-INF [root@iZbp12fj4dxm8z5uofcvshZ test]# ls WEB-INF [root@iZbp12fj4dxm8z5uofcvshZ test]# cd WEB-INF/ [root@iZbp12fj4dxm8z5uofcvshZ WEB-INF]# vim web.xml [root@iZbp12fj4dxm8z5uofcvshZ test]# cat index.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %>$Title$ hello,Docker [root@iZbp12fj4dxm8z5uofcvshZ test]# cd WEB-INF/ [root@iZbp12fj4dxm8z5uofcvshZ WEB-INF]# cat web.xml[root@iZbp12fj4dxm8z5uofcvshZ WEB-INF]# cd .. [root@iZbp12fj4dxm8z5uofcvshZ test]# vim index.jsp [root@iZbp12fj4dxm8z5uofcvshZ test]# cat index.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> $Title$ hello,Docker远程访问测试成功!
七、发布镜像到DockerHub、阿里云
(1)DockerHub
1.注册账号
https://hub.docker.com/注册账号
2.在服务器上提交镜像
登录账号
[root@iZbp12fj4dxm8z5uofcvshZ home]# docker login -u chen Password:push
[root@iZbp12fj4dxm8z5uofcvshZ home]# docker push chen/mtomcat:1.0(2)阿里云
1.登录阿里云
2.找到容器镜像服务
3.创建命名空间
4.创建容器镜像
5.查看push步骤(参考官方文档)
八、子容器和父容器数据同步
九、Docker网络
清空当前Docker环境
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker rmi -f $(docker images -aq)可以看到三个网络
[root@iZbp12fj4dxm8z5uofcvshZ ~]# ip addr 1: lo: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 2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:3f:00:35:6c brd ff:ff:ff:ff:ff:ff inet 172.18.149.244/20 brd 172.18.159.255 scope global dynamic eth0 valid_lft 312613169sec preferred_lft 312613169sec 3: docker0: mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:d4:4c:29:57 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 启动一个容器后
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker run -d -P --name tomcat01 tomcat[root@iZbp12fj4dxm8z5uofcvshZ ~]# ip addr 1: lo: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 2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:3f:00:35:6c brd ff:ff:ff:ff:ff:ff inet 172.18.149.244/20 brd 172.18.159.255 scope global dynamic eth0 valid_lft 312612484sec preferred_lft 312612484sec 3: docker0: mtu 1500 qdisc noqueue state UP group default link/ether 02:42:d4:4c:29:57 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 51: veth5edac62@if50: mtu 1500 qdisc noqueue master docker0 state UP group default link/ether e2:d5:d1:a0:ae:28 brd ff:ff:ff:ff:ff:ff link-netnsid 0 Docker网络原理
自定义网络
查看所有的docker网络
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 0e8e9abab2e1 bridge bridge local bfff1fecb917 host host local 5d21e554855f none null local网络模式:
bridge 桥接
none 不配置网络
host 和宿主机共享网络
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet f1e7e4a9a619dcba3cdfca14cb8a79d8090cf537b2c030a9ae13c8492b49cddb [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 0e8e9abab2e1 bridge bridge local bfff1fecb917 host host local f1e7e4a9a619 mynet bridge local 5d21e554855f none null local[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker network inspect mynet [ { "Name": "mynet", "Id": "f1e7e4a9a619dcba3cdfca14cb8a79d8090cf537b2c030a9ae13c8492b49cddb", "Created": "2021-11-06T10:48:42.282037706+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@iZbp12fj4dxm8z5uofcvshZ ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat b9d69e70d4c4589da63aba849d216cc4893d30875007b1b07a38ad5f5ec59a63 [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat d7ad19d64f7098340d047619f7604e79439774f877ee3d4e85a9f7eb21d8cd4b [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker network inspect mynet测试ping连接
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
十、Redis集群部署
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker network create redis --subnet 172.38.0.0/16 f312b2b3aa9ffb898a5e49f856a8d57d524acae841e6ebed7469acbef7db8808 [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 0e8e9abab2e1 bridge bridge local bfff1fecb917 host host local f1e7e4a9a619 mynet bridge local 5d21e554855f none null local f312b2b3aa9f redis bridge local[root@iZbp12fj4dxm8z5uofcvshZ ~]# for port in $(seq 1 6); > do > mkdir -p /mydata/redis/node-${port}/conf > touch /mydata/redis/node-${port}/conf/redis.conf > cat << EOF >/mydata/redis/node-${port}/conf/redis.conf > port 6379 > bind 0.0.0.0 > cluster-enabled yes > cluster-config-file nodes.conf > cluster-node-timeout 5000 > cluster-announce-ip 172.38.0.1${port} > cluster-announce-port 6379 > cluster-announce-bus-port 16379 > appendonly yes > EOF > done [root@iZbp12fj4dxm8z5uofcvshZ ~]# cd /mydata/ [root@iZbp12fj4dxm8z5uofcvshZ mydata]# ls redis [root@iZbp12fj4dxm8z5uofcvshZ mydata]# cd redis/ [root@iZbp12fj4dxm8z5uofcvshZ redis]# ls node-1 node-2 node-3 node-4 node-5 node-6[root@iZbp12fj4dxm8z5uofcvshZ /]# docker run -p 6371:6379 --name redis-1 > -v /mydata/redis/node-1/data:/data > -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf > -d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf [root@iZbp12fj4dxm8z5uofcvshZ /]# docker run -p 6372:6379 --name redis-2 -v /mydata/redis/node-2/data:/data -v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf [root@iZbp12fj4dxm8z5uofcvshZ /]# docker run -p 6373:6379 --name redis-3 -v /mydata/redis/node-3/data:/data -v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf [root@iZbp12fj4dxm8z5uofcvshZ /]# docker run -p 6374:6379 --name redis-4 -v /mydata/redis/node-4/data:/data -v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf [root@iZbp12fj4dxm8z5uofcvshZ /]# docker run -p 6375:6379 --name redis-5 -v /mydata/redis/node-5/data:/data -v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf [root@iZbp12fj4dxm8z5uofcvshZ /]# docker run -p 6376:6379 --name redis-6 -v /mydata/redis/node-6/data:/data -v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf[root@iZbp12fj4dxm8z5uofcvshZ /]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6f46c8d67b01 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 0.0.0.0:6376->6379/tcp redis-6 b9c2453b7171 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 18 seconds ago Up 17 seconds 0.0.0.0:6375->6379/tcp redis-5 78d2ed13d5e4 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 30 seconds ago Up 29 seconds 0.0.0.0:6374->6379/tcp redis-4 2a8ca7940171 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 45 seconds ago Up 44 seconds 0.0.0.0:6373->6379/tcp redis-3 127e6eaecc2f redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:6372->6379/tcp redis-2 20ea89cc276b redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 8 minutes ago Up 8 minutes 0.0.0.0:6371->6379/tcp redis-1[root@iZbp12fj4dxm8z5uofcvshZ /]# docker exec -it redis-1 /bin/sh /data # ls appendonly.aof nodes.conf /data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 172.38.0.15:6379 to 172.38.0.11:6379 Adding replica 172.38.0.16:6379 to 172.38.0.12:6379 Adding replica 172.38.0.14:6379 to 172.38.0.13:6379 M: cc0e9685c12f4a2a27abe8ffef367d3b4413e42e 172.38.0.11:6379 slots:[0-5460] (5461 slots) master M: fd8620b16c0b89c5ea904897f335b74aa6329f21 172.38.0.12:6379 slots:[5461-10922] (5462 slots) master M: 9b88f0376b20c52f0ff4218ebd1e872421d79a4f 172.38.0.13:6379 slots:[10923-16383] (5461 slots) master S: 338a76cf44828c3319e25e5e8a92915e617b9a14 172.38.0.14:6379 replicates 9b88f0376b20c52f0ff4218ebd1e872421d79a4f S: 7c84088e63222d5a5ed583c63cb69b3bf8befe8e 172.38.0.15:6379 replicates cc0e9685c12f4a2a27abe8ffef367d3b4413e42e S: 44b78c8a5f080dded24e509cd42dcb226301476f 172.38.0.16:6379 replicates fd8620b16c0b89c5ea904897f335b74aa6329f21 Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join ... >>> Performing Cluster Check (using node 172.38.0.11:6379) M: cc0e9685c12f4a2a27abe8ffef367d3b4413e42e 172.38.0.11:6379 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: 7c84088e63222d5a5ed583c63cb69b3bf8befe8e 172.38.0.15:6379 slots: (0 slots) slave replicates cc0e9685c12f4a2a27abe8ffef367d3b4413e42e S: 44b78c8a5f080dded24e509cd42dcb226301476f 172.38.0.16:6379 slots: (0 slots) slave replicates fd8620b16c0b89c5ea904897f335b74aa6329f21 S: 338a76cf44828c3319e25e5e8a92915e617b9a14 172.38.0.14:6379 slots: (0 slots) slave replicates 9b88f0376b20c52f0ff4218ebd1e872421d79a4f M: fd8620b16c0b89c5ea904897f335b74aa6329f21 172.38.0.12:6379 slots:[5461-10922] (5462 slots) master 1 additional replica(s) M: 9b88f0376b20c52f0ff4218ebd1e872421d79a4f 172.38.0.13:6379 slots:[10923-16383] (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.查看集群信息
/data # redis-cli -c 127.0.0.1:6379> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:125 cluster_stats_messages_pong_sent:117 cluster_stats_messages_sent:242 cluster_stats_messages_ping_received:112 cluster_stats_messages_pong_received:125 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:242测试:
127.0.0.1:6379> set key1 a -> Redirected to slot [9189] located at 172.38.0.12:6379 OK此时停止redis-2容器
[root@iZbp12fj4dxm8z5uofcvshZ ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6f46c8d67b01 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:6376->6379/tcp redis-6 b9c2453b7171 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:6375->6379/tcp redis-5 78d2ed13d5e4 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:6374->6379/tcp redis-4 2a8ca7940171 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 13 minutes ago Up 13 minutes 0.0.0.0:6373->6379/tcp redis-3 127e6eaecc2f redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 15 minutes ago Up 15 minutes 0.0.0.0:6372->6379/tcp redis-2 20ea89cc276b redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 20 minutes ago Up 20 minutes 0.0.0.0:6371->6379/tcp redis-1 [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker stop redis-2 redis-2 [root@iZbp12fj4dxm8z5uofcvshZ ~]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6f46c8d67b01 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:6376->6379/tcp redis-6 b9c2453b7171 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:6375->6379/tcp redis-5 78d2ed13d5e4 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 13 minutes ago Up 13 minutes 0.0.0.0:6374->6379/tcp redis-4 2a8ca7940171 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 13 minutes ago Up 13 minutes 0.0.0.0:6373->6379/tcp redis-3 20ea89cc276b redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 21 minutes ago Up 21 minutes 0.0.0.0:6371->6379/tcp redis-1/data # redis-cli -c 127.0.0.1:6379> get key1 -> Redirected to slot [9189] located at 172.38.0.16:6379 "a" 172.38.0.16:6379> get key1 "a"172.38.0.16:6379> cluster nodes 9b88f0376b20c52f0ff4218ebd1e872421d79a4f 172.38.0.13:6379@16379 master - 0 1636170719000 3 connected 10923-16383 fd8620b16c0b89c5ea904897f335b74aa6329f21 172.38.0.12:6379@16379 master,fail - 1636170199097 1636170197593 2 connected 338a76cf44828c3319e25e5e8a92915e617b9a14 172.38.0.14:6379@16379 slave 9b88f0376b20c52f0ff4218ebd1e872421d79a4f 0 1636170719594 4 connected 7c84088e63222d5a5ed583c63cb69b3bf8befe8e 172.38.0.15:6379@16379 slave cc0e9685c12f4a2a27abe8ffef367d3b4413e42e 0 1636170720196 5 connected 44b78c8a5f080dded24e509cd42dcb226301476f 172.38.0.16:6379@16379 myself,master - 0 1636170717000 7 connected 5461-10922 cc0e9685c12f4a2a27abe8ffef367d3b4413e42e 172.38.0.11:6379@16379 master - 0 1636170719193 1 connected 0-5460
十一、SpringBoot微服务打包Docker镜像
构建镜像
[root@iZbp12fj4dxm8z5uofcvshZ idea]# ls Dockerfile SpringBoot-Docker-0.0.1-SNAPSHOT.jar [root@iZbp12fj4dxm8z5uofcvshZ idea]# vim Dockerfile FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"] [root@iZbp12fj4dxm8z5uofcvshZ idea]# docker build -t docker-web .启动一个容器
[root@iZbp12fj4dxm8z5uofcvshZ idea]# docker run -d -P --name chen-springboot-docker docker-web 352322c01534da928d65375c4c81fc2cab37f2ba53b84389ac381e070a34b23a [root@iZbp12fj4dxm8z5uofcvshZ idea]# docker ps ConTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 352322c01534 docker-web "java -jar /app.jar …" 4 seconds ago Up 3 seconds 0.0.0.0:49159->8080/tcp chen-springboot-docker测试
[root@iZbp12fj4dxm8z5uofcvshZ idea]# curl localhost:49159/hello hello,Docker[root@iZbp12fj4dxm8z5uofcvshZ idea]#



