栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Docker

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Docker

一、安装

 

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-world 

Hello 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.3kB

REPOSITORY 镜像的仓库源

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           只显示镜像的id

docker 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     NAMES

docker 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   231MB

docker 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 nginx

2.具名挂载,通过 -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"]            0B        
      7 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.txt

2.编写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.out

3.构建镜像

[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:latest

4.启动测试

[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]# 
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/451026.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号