架构师第五周作业(Architect week 5 assignment)

第五周一、安装docker并配置镜像加速。

###  Ubuntu使用 apt-get 进行安装)# step 1: 安装必要的一些系统工具root@ubuntu1804:~#apt-get updateroot@ubuntu1804:~#apt-get -y install apt-transport-https ca-certificates curl software-properties-common# step 2: 安装GPG证书root@ubuntu1804:~#curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -# Step 3: 写入软件源信息root@ubuntu1804:~# add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"# Step 4: 更新并安装Docker-CEroot@ubuntu1804:~# apt-get -y updateroot@ubuntu1804:~# apt-get -y install docker-ce# 安装指定版本的Docker-CE:# Step 1: 查找Docker-CE的版本:# apt-cache madison docker-ce#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)# sudo apt-get -y install docker-ce=[VERSION]###  CentOS 7(使用 yum 进行安装)# step 1: 安装必要的一些系统工具[root@localhost ~]#yum install -y yum-utils device-mapper-persistent-data lvm2# Step 2: 添加软件源信息[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoLoaded plugins: fastestmirroradding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repograbbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.reporepo saved to /etc/yum.repos.d/docker-ce.repo# Step 3:修改源地址[root@localhost ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo# Step 4: 更新并安装Docker-CE[root@localhost ~]# yum makecache fast[root@localhost ~]# yum -y install docker-ce# Step 5: 开启Docker服务[root@localhost ~]# systemctl enable --now docker# 注意:# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。# vim /etc/yum.repos.d/docker-ce.repo#   将[docker-ce-test]下方的enabled=0修改为enabled=1## 安装指定版本的Docker-CE:# Step 1: 查找Docker-CE的版本:# yum list docker-ce.x86_64 --showduplicates | sort -r#   Loading mirror speeds from cached hostfile#   Loaded plugins: branch, fastestmirror, langpacks#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable#   Available Packages# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)# sudo yum -y install docker-ce-[VERSION]###配置镜像加速#浏览器打开http://cr.console.aliyun.com,注册或登录阿里云账号,点击左侧的镜像加速器,将会得到一个专属的加速地址,而且下面有使用配置说明:[root@localhost ~]#  mkdir -p /etc/docker[root@localhost ~]#  tee /etc/docker/daemon.json <<-'EOF'{  "registry-mirrors": ["https://21b88v0o.mirror.aliyuncs.com"]}EOF[root@localhost ~]#  systemctl daemon-reload[root@localhost ~]#  systemctl restart docker

二、dockerfile常用指令总结。

#dockerfile 文件中的常见指令: 1:FROM: 指定基础镜像 #FROM 就是指定基础镜像,此指令通常必需放在Dockerfile文件第一个非注释行。后续的指令都是运行于此基准镜像所提供的运行环境  2:LABEL: 指定镜像元数据 #可以指定镜像元数据,如: 镜像作者等。  #一个镜像可以有多个label ,还可以写在一行中,即多标签写法,可以减少镜像的的大小  3:MAINTAINER: 指定维护者信息 #此指令已过时,用LABEL代替  4:RUN: 执行 shell命令 #RUN 指令用来在构建镜像阶段需要执行 FROM 指定镜像所支持的Shell命令。 #RUN 可以写多个,每一个RUN指令都会建立一个镜像层,所以尽可能合并成一条指令,比如将多个shell命令通过 && 连接一起成为在一条指令 #每个RUN都是独立运行的,和前一个RUN无关  5:ENV: 设置环境变量 #ENV 可以定义环境变量和值,会被后续指令(如:ENV,ADD,COPY,RUN等)通过$KEY或${KEY}进行引用,并在容器运行时保持  6:COPY: 复制文本 #复制本地宿主机的文件到容器中。  7:ADD: 复制和解包文件 #该命令可认为是增强版的COPY,不仅支持COPY,还支持自动解压缩。可以将复制指定的文件到容器中  8:CMD: 容器启动命令 #一个容器中需要持续运行的进程一般只有一个,CMD 用来指定启动容器时默认执行的一个命令,且其运行结束后,容器也会停止,所以一般CMD 指定的命令为持续运行且为前台命令 #每个 Dockerfile 只能有一条 CMD 命令。如指定了多条,只有最后一条被执行 #如果用户启动容器时用 docker run xxx 指定运行的命令,则会覆盖 CMD 指定的命令  9:ENTRYPOINT: 入口点 #功能类似于CMD,配置容器启动后执行的命令及参数  #ENTRYPOINT 不能被 docker run 提供的参数覆盖,而是追加,即如果docker run 命令有参数,那么参数全部都会作为ENTRYPOINT的参数#如果docker run 后面没有额外参数,但是dockerfile中的CMD里有(即上面CMD的第三种用法),即Dockerfile中即有CMD也有ENTRYPOINT,那么CMD的全部内容会作为ENTRYPOINT的参数#如果docker run 后面有额外参数,同时Dockerfile中即有CMD也有ENTRYPOINT,那么docker run后面的参数覆盖掉CMD参数内容,最终作为ENTRYPOINT的参数#可以通过docker run --entrypoint string 参数在运行时替换,注意string不要加空格#使用CMD要在运行时重新写命令本身,然后在后面才能追加运行参数,ENTRYPOINT则可以运行时无需重写命令就可以直接接受新参数#每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个生效  10:ARG: 构建参数。 #ARG指令在build 阶段指定变量,和ENV不同的是,容器运行时不会存在这些环境变量。如果和ENV同名,ENV覆盖ARG变量。  11:VOLUME: 匿名卷 #在容器中创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等,一般会将宿主机上的目录挂载至VOLUME 指令指定的容器目录。即使容器后期被删除,此宿主机的目录仍会保留,从而实现容器数据的持久保存。  12:EXPOSE: 暴露端口 #指定服务端的容器需要对外暴露(监听)的端口号,以实现容器与外部通信。 #EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会真正暴露端口,即不会自动在宿主进行端口映射因此,在启动容器时需要通过 -P 或-p ,Docker 主机才会真正分配一个端口转发到指定暴露的端口才可使用 #注意: 即使 Dockerfile没有EXPOSE 端口指令,也可以通过docker run -p 临时暴露容器内程序真正监听的端口,所以EXPOSE 相当于指定默认的暴露端口,可以通过docker run -P 进行真正暴露  13:WORKDIR: 指定工作目录 #为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内WORKDIR指定的默认目录 #WORKDIR 指定工作目录(或称当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会自行创建  14:ONBUILD: 子镜像引用父镜像的指令 #可以用来配置当构建当前镜像的子镜像时,会自动触发执行的指令,但在当前镜像构建时,并不会执行,即延迟到子镜像构建时才执行  15:USER: 指定当前用户 #指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。这个用户必须是事先建立好的,否则无法切换。如果没有指定 USER,默认是 root 身份执行  16:HEALTHCHECK: 健康检查 #检查容器的健康性  17:STOPSIGNAL: 退出容器的信号 #该 STOPSIGNAL 指令设置将被发送到容器退出的系统调用信号。该信号可以是与内核syscall表中的位置匹配的有效无符号数字(例如9),也可以是SIGNAME格式的信号名称(例如SIGKILL)  18:SHELL : 指定shell #SHELL指令允许覆盖用于命令的shell形式的默认SHELL, 必须在Dockerfile中以JSON形式编写SHELL指令。 #在Linux上默认SHELL程序为[“/bin/sh”,“-c”],在Windows上,默认SHELL程序为[“cmd”,“/S”,“/C”]。#SHELL指令在Windows上特别有用,在Windows上有两个常用且完全不同的本机SHELL:cmd和powershell,以及包括sh在内的备用shell。#SHELL指令可以出现多次。 每个SHELL指令将覆盖所有先前的SHELL指令,并影响所有后续的指令

三、基于alpine制作tomcat镜像

制作alpine的自定义系统镜像#下载alpine镜像,打新标签[root@ubuntu1804 ~]#docker pull alpineUsing default tag: latestlatest: Pulling from library/alpine59bf1c3509f3: Pull completeDigest: sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300Status: Downloaded newer image for alpine:latestdocker.io/library/alpine:latest[root@ubuntu1804 ~]#docker tag alpine alpine:3.11[root@ubuntu1804 ~]#docker imagesREPOSITORY   TAG       IMAGE ID       CREATED        SIZEalpine       3.11      c059bfaa849c   5 months ago   5.59MBalpine       latest    c059bfaa849c   5 months ago   5.59MB#准备相关文件[root@ubuntu1804 ~]# mkdir -p /data/dockerfile/system/alpine[root@ubuntu1804 ~]#cd /data/dockerfile/system/alpine[root@ubuntu1804 alpine]#cat repositories http://mirrors.aliyun.com/alpine/v3.11/mainhttp://mirrors.aliyun.com/alpine/v3.11/community#准备Dockerfile文件[root@ubuntu1804 alpine]#cat Dockerfile FROM alpine:3.11 LABEL maintainer="tanliang"COPY repositories /etc/apk/repositories RUN apk update && apk --no-cache add iotop gcc libgcc libc-dev libcurl libc-utils pcre-dev zlib-dev libnfs make pcre pcre2 zip unzip net-tools pstree wget libevent libevent-dev iproute2  openjdk8-jre-base  #安装JDK及相关软件包#构建alpine镜像[root@ubuntu1804 ~]#vim /data/dockerfile/system/alpine/build.sh[root@ubuntu1804 ~]#cat /data/dockerfile/system/alpine/build.sh#!/bin/bashdocker build -t alpine-jdk:1.8 .[root@ubuntu1804 alpine]#bash build.sh......6/68) Installing wget (1.20.3-r0)(67/68) Installing zip (3.0-r7)(68/68) Installing zlib-dev (1.2.11-r3)Executing busybox-1.34.1-r3.triggerExecuting ca-certificates-20191127-r2.triggerExecuting java-common-0.2-r0.triggerOK: 256 MiB in 80 packagesRemoving intermediate container f04cbc7dcfff ---> 278a3c33c0bbSuccessfully built 278a3c33c0bbSuccessfully tagged alpine-jdk:1.8[root@ubuntu1804 ~]#docker imagesREPOSITORY   TAG       IMAGE ID       CREATED         SIZEalpine-jdk   1.8       278a3c33c0bb   2 minutes ago   256MBalpine       3.11      c059bfaa849c   5 months ago    5.59MBalpine       latest    c059bfaa849c   5 months ago    5.59MB#构建alpine镜像卡住解决方法#进入卡住的那一层容器运行此命令报错root@ubuntu1804:~# docker exec -it f3 sh/ # apk update && apk --no-cache add iotop gcc libgcc libc-dev libcurl libc-utils pcre-dev zlib-dev libnfs make pcre pcre2 zip unzip net-tools pstree wget libevent libevent-dev iproute2ERROR: Unable to lock database: temporary error (try again later)ERROR: Failed to open apk database: temporary error (try again later)#解决方法:[root@ubuntu1804 alpine]# cat /etc/default/docker |grep -v '#'DOCKER_OPTS="--dns 114.114.114.114"[root@ubuntu1804 alpine]#systemctl restart docker 从JDK镜像构建tomcat 8 Base镜像 下载tomcat安装包 [root@docker ~]# mkdir tomcat &&cd tomcat[root@docker tomcat]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.78/bin/apache-tomcat-8.5.78.tar.gz#编写Dockerfile文件 [root@docker tomcat]#vim DockerfileFROM alpine-jdk:1.8LABEL maintainer="tanliang"ENV TZ "Asia/Shanghai"ENV LANG en_US.UTF-8ENV TERM xtermENV TOMCAT_MAJOR_VERSION 8ENV TOMCAT_MINOR_VERSION 8.5.78ENV CATALINA_HOME /apps/tomcatENV APP_DIR ${CATALINA_HOME}/webappsRUN mkdir /appsADD apache-tomcat-8.5.78.tar.gz /apps                                               RUN ln -s /apps/apache-tomcat-8.5.78 /apps/tomcatEXPOSE 8080 8009ENTRYPOINT ["/apps/tomcat/bin/catalina.sh","run"]#构建基于alpine-JDK的tomcat镜像[root@docker tomcat]# docker build -t tomcat-base:v8.5.78 .emoving intermediate container 9cf40b29814d ---> e52fc15461a4Step 14/14 : ENTRYPOINT ["/apps/tomcat/bin/catalina.sh","run"] ---> Running in ca3994f70f7cRemoving intermediate container ca3994f70f7c ---> 053aedfa3ceaSuccessfully built 053aedfa3ceaSuccessfully tagged tomcat-base:v8.5.78[root@docker tomcat]# docker images tomcat-baseREPOSITORY    TAG       IMAGE ID       CREATED          SIZEtomcat-base   v8.5.78   053aedfa3cea   19 seconds ago   271MB#创建tomcat容器[root@docker tomcat]# docker run -d -p 8080:8080 tomcat-base:v8.5.78#测试验证root@ubuntu1804:/data/dockerfile/tomcat# curl 172.17.0.2:8080 -IHTTP/1.1 200Content-Type: text/html;charset=UTF-8Transfer-Encoding: chunkedDate: Fri, 13 May 2022 14:50:28 GMT

四、利用桥接实现不同宿主机间容器互联。

#环境配置:Ubuntu1804  宿主机地址:10.0.0.151 容器地址:172.17.0.2centos7     宿主机地址:10.0.0.152 容器地址:172.17.0.3#两台宿主机安装网桥工具bridge-utilsroot@ubuntu1804:~# apt -y install bridge-utils[root@localhost ~]# yum -y install bridge-utils#将eth0加到网桥接口docker0上(此时会无法连接外网)root@ubuntu1804:~# brctl addif docker0 eth0[root@localhost ~]#brctl addif docker0 eth0#在两个宿主机上各启动一个容器,以需要确保两个容器IP不同,相互测试访问root@ubuntu1804:~# docker psCONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES6d0b5c840323   busybox   "sh"      57 seconds ago   Up 56 seconds             b1root@ubuntu1804:~# docker exec 6d hostname -i172.17.0.2[root@10 ~]# docker psCONTAINER ID   IMAGE     COMMAND   CREATED              STATUS              PORTS     NAMES83637fec6704   busybox   "sh"      About a minute ago   Up About a minute             b2d3f9eec36a40   busybox   "sh"      2 minutes ago        Up 2 minutes                  elastic_wescoff[root@10 ~]# docker exec 83 hostname -i172.17.0.3#在ubutu上测试ping172.17.0.3成功root@ubuntu1804:~# docker exec 6d ping 172.17.0.3
————————

Fifth, install docker and configure image acceleration.

###  Ubuntu使用 apt-get 进行安装)# step 1: 安装必要的一些系统工具root@ubuntu1804:~#apt-get updateroot@ubuntu1804:~#apt-get -y install apt-transport-https ca-certificates curl software-properties-common# step 2: 安装GPG证书root@ubuntu1804:~#curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -# Step 3: 写入软件源信息root@ubuntu1804:~# add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"# Step 4: 更新并安装Docker-CEroot@ubuntu1804:~# apt-get -y updateroot@ubuntu1804:~# apt-get -y install docker-ce# 安装指定版本的Docker-CE:# Step 1: 查找Docker-CE的版本:# apt-cache madison docker-ce#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)# sudo apt-get -y install docker-ce=[VERSION]###  CentOS 7(使用 yum 进行安装)# step 1: 安装必要的一些系统工具[root@localhost ~]#yum install -y yum-utils device-mapper-persistent-data lvm2# Step 2: 添加软件源信息[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoLoaded plugins: fastestmirroradding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repograbbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.reporepo saved to /etc/yum.repos.d/docker-ce.repo# Step 3:修改源地址[root@localhost ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo# Step 4: 更新并安装Docker-CE[root@localhost ~]# yum makecache fast[root@localhost ~]# yum -y install docker-ce# Step 5: 开启Docker服务[root@localhost ~]# systemctl enable --now docker# 注意:# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。# vim /etc/yum.repos.d/docker-ce.repo#   将[docker-ce-test]下方的enabled=0修改为enabled=1## 安装指定版本的Docker-CE:# Step 1: 查找Docker-CE的版本:# yum list docker-ce.x86_64 --showduplicates | sort -r#   Loading mirror speeds from cached hostfile#   Loaded plugins: branch, fastestmirror, langpacks#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable#   Available Packages# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)# sudo yum -y install docker-ce-[VERSION]###配置镜像加速#浏览器打开http://cr.console.aliyun.com,注册或登录阿里云账号,点击左侧的镜像加速器,将会得到一个专属的加速地址,而且下面有使用配置说明:[root@localhost ~]#  mkdir -p /etc/docker[root@localhost ~]#  tee /etc/docker/daemon.json <<-'EOF'{  "registry-mirrors": ["https://21b88v0o.mirror.aliyuncs.com"]}EOF[root@localhost ~]#  systemctl daemon-reload[root@localhost ~]#  systemctl restart docker

2、 Dockerfile common instruction summary.

#dockerfile 文件中的常见指令: 1:FROM: 指定基础镜像 #FROM 就是指定基础镜像,此指令通常必需放在Dockerfile文件第一个非注释行。后续的指令都是运行于此基准镜像所提供的运行环境  2:LABEL: 指定镜像元数据 #可以指定镜像元数据,如: 镜像作者等。  #一个镜像可以有多个label ,还可以写在一行中,即多标签写法,可以减少镜像的的大小  3:MAINTAINER: 指定维护者信息 #此指令已过时,用LABEL代替  4:RUN: 执行 shell命令 #RUN 指令用来在构建镜像阶段需要执行 FROM 指定镜像所支持的Shell命令。 #RUN 可以写多个,每一个RUN指令都会建立一个镜像层,所以尽可能合并成一条指令,比如将多个shell命令通过 && 连接一起成为在一条指令 #每个RUN都是独立运行的,和前一个RUN无关  5:ENV: 设置环境变量 #ENV 可以定义环境变量和值,会被后续指令(如:ENV,ADD,COPY,RUN等)通过$KEY或${KEY}进行引用,并在容器运行时保持  6:COPY: 复制文本 #复制本地宿主机的文件到容器中。  7:ADD: 复制和解包文件 #该命令可认为是增强版的COPY,不仅支持COPY,还支持自动解压缩。可以将复制指定的文件到容器中  8:CMD: 容器启动命令 #一个容器中需要持续运行的进程一般只有一个,CMD 用来指定启动容器时默认执行的一个命令,且其运行结束后,容器也会停止,所以一般CMD 指定的命令为持续运行且为前台命令 #每个 Dockerfile 只能有一条 CMD 命令。如指定了多条,只有最后一条被执行 #如果用户启动容器时用 docker run xxx 指定运行的命令,则会覆盖 CMD 指定的命令  9:ENTRYPOINT: 入口点 #功能类似于CMD,配置容器启动后执行的命令及参数  #ENTRYPOINT 不能被 docker run 提供的参数覆盖,而是追加,即如果docker run 命令有参数,那么参数全部都会作为ENTRYPOINT的参数#如果docker run 后面没有额外参数,但是dockerfile中的CMD里有(即上面CMD的第三种用法),即Dockerfile中即有CMD也有ENTRYPOINT,那么CMD的全部内容会作为ENTRYPOINT的参数#如果docker run 后面有额外参数,同时Dockerfile中即有CMD也有ENTRYPOINT,那么docker run后面的参数覆盖掉CMD参数内容,最终作为ENTRYPOINT的参数#可以通过docker run --entrypoint string 参数在运行时替换,注意string不要加空格#使用CMD要在运行时重新写命令本身,然后在后面才能追加运行参数,ENTRYPOINT则可以运行时无需重写命令就可以直接接受新参数#每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个生效  10:ARG: 构建参数。 #ARG指令在build 阶段指定变量,和ENV不同的是,容器运行时不会存在这些环境变量。如果和ENV同名,ENV覆盖ARG变量。  11:VOLUME: 匿名卷 #在容器中创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等,一般会将宿主机上的目录挂载至VOLUME 指令指定的容器目录。即使容器后期被删除,此宿主机的目录仍会保留,从而实现容器数据的持久保存。  12:EXPOSE: 暴露端口 #指定服务端的容器需要对外暴露(监听)的端口号,以实现容器与外部通信。 #EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会真正暴露端口,即不会自动在宿主进行端口映射因此,在启动容器时需要通过 -P 或-p ,Docker 主机才会真正分配一个端口转发到指定暴露的端口才可使用 #注意: 即使 Dockerfile没有EXPOSE 端口指令,也可以通过docker run -p 临时暴露容器内程序真正监听的端口,所以EXPOSE 相当于指定默认的暴露端口,可以通过docker run -P 进行真正暴露  13:WORKDIR: 指定工作目录 #为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内WORKDIR指定的默认目录 #WORKDIR 指定工作目录(或称当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会自行创建  14:ONBUILD: 子镜像引用父镜像的指令 #可以用来配置当构建当前镜像的子镜像时,会自动触发执行的指令,但在当前镜像构建时,并不会执行,即延迟到子镜像构建时才执行  15:USER: 指定当前用户 #指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。这个用户必须是事先建立好的,否则无法切换。如果没有指定 USER,默认是 root 身份执行  16:HEALTHCHECK: 健康检查 #检查容器的健康性  17:STOPSIGNAL: 退出容器的信号 #该 STOPSIGNAL 指令设置将被发送到容器退出的系统调用信号。该信号可以是与内核syscall表中的位置匹配的有效无符号数字(例如9),也可以是SIGNAME格式的信号名称(例如SIGKILL)  18:SHELL : 指定shell #SHELL指令允许覆盖用于命令的shell形式的默认SHELL, 必须在Dockerfile中以JSON形式编写SHELL指令。 #在Linux上默认SHELL程序为[“/bin/sh”,“-c”],在Windows上,默认SHELL程序为[“cmd”,“/S”,“/C”]。#SHELL指令在Windows上特别有用,在Windows上有两个常用且完全不同的本机SHELL:cmd和powershell,以及包括sh在内的备用shell。#SHELL指令可以出现多次。 每个SHELL指令将覆盖所有先前的SHELL指令,并影响所有后续的指令

3、 Making Tomcat image based on Alpine

制作alpine的自定义系统镜像#下载alpine镜像,打新标签[root@ubuntu1804 ~]#docker pull alpineUsing default tag: latestlatest: Pulling from library/alpine59bf1c3509f3: Pull completeDigest: sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300Status: Downloaded newer image for alpine:latestdocker.io/library/alpine:latest[root@ubuntu1804 ~]#docker tag alpine alpine:3.11[root@ubuntu1804 ~]#docker imagesREPOSITORY   TAG       IMAGE ID       CREATED        SIZEalpine       3.11      c059bfaa849c   5 months ago   5.59MBalpine       latest    c059bfaa849c   5 months ago   5.59MB#准备相关文件[root@ubuntu1804 ~]# mkdir -p /data/dockerfile/system/alpine[root@ubuntu1804 ~]#cd /data/dockerfile/system/alpine[root@ubuntu1804 alpine]#cat repositories http://mirrors.aliyun.com/alpine/v3.11/mainhttp://mirrors.aliyun.com/alpine/v3.11/community#准备Dockerfile文件[root@ubuntu1804 alpine]#cat Dockerfile FROM alpine:3.11 LABEL maintainer="tanliang"COPY repositories /etc/apk/repositories RUN apk update && apk --no-cache add iotop gcc libgcc libc-dev libcurl libc-utils pcre-dev zlib-dev libnfs make pcre pcre2 zip unzip net-tools pstree wget libevent libevent-dev iproute2  openjdk8-jre-base  #安装JDK及相关软件包#构建alpine镜像[root@ubuntu1804 ~]#vim /data/dockerfile/system/alpine/build.sh[root@ubuntu1804 ~]#cat /data/dockerfile/system/alpine/build.sh#!/bin/bashdocker build -t alpine-jdk:1.8 .[root@ubuntu1804 alpine]#bash build.sh......6/68) Installing wget (1.20.3-r0)(67/68) Installing zip (3.0-r7)(68/68) Installing zlib-dev (1.2.11-r3)Executing busybox-1.34.1-r3.triggerExecuting ca-certificates-20191127-r2.triggerExecuting java-common-0.2-r0.triggerOK: 256 MiB in 80 packagesRemoving intermediate container f04cbc7dcfff ---> 278a3c33c0bbSuccessfully built 278a3c33c0bbSuccessfully tagged alpine-jdk:1.8[root@ubuntu1804 ~]#docker imagesREPOSITORY   TAG       IMAGE ID       CREATED         SIZEalpine-jdk   1.8       278a3c33c0bb   2 minutes ago   256MBalpine       3.11      c059bfaa849c   5 months ago    5.59MBalpine       latest    c059bfaa849c   5 months ago    5.59MB#构建alpine镜像卡住解决方法#进入卡住的那一层容器运行此命令报错root@ubuntu1804:~# docker exec -it f3 sh/ # apk update && apk --no-cache add iotop gcc libgcc libc-dev libcurl libc-utils pcre-dev zlib-dev libnfs make pcre pcre2 zip unzip net-tools pstree wget libevent libevent-dev iproute2ERROR: Unable to lock database: temporary error (try again later)ERROR: Failed to open apk database: temporary error (try again later)#解决方法:[root@ubuntu1804 alpine]# cat /etc/default/docker |grep -v '#'DOCKER_OPTS="--dns 114.114.114.114"[root@ubuntu1804 alpine]#systemctl restart docker 从JDK镜像构建tomcat 8 Base镜像 下载tomcat安装包 [root@docker ~]# mkdir tomcat &&cd tomcat[root@docker tomcat]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.78/bin/apache-tomcat-8.5.78.tar.gz#编写Dockerfile文件 [root@docker tomcat]#vim DockerfileFROM alpine-jdk:1.8LABEL maintainer="tanliang"ENV TZ "Asia/Shanghai"ENV LANG en_US.UTF-8ENV TERM xtermENV TOMCAT_MAJOR_VERSION 8ENV TOMCAT_MINOR_VERSION 8.5.78ENV CATALINA_HOME /apps/tomcatENV APP_DIR ${CATALINA_HOME}/webappsRUN mkdir /appsADD apache-tomcat-8.5.78.tar.gz /apps                                               RUN ln -s /apps/apache-tomcat-8.5.78 /apps/tomcatEXPOSE 8080 8009ENTRYPOINT ["/apps/tomcat/bin/catalina.sh","run"]#构建基于alpine-JDK的tomcat镜像[root@docker tomcat]# docker build -t tomcat-base:v8.5.78 .emoving intermediate container 9cf40b29814d ---> e52fc15461a4Step 14/14 : ENTRYPOINT ["/apps/tomcat/bin/catalina.sh","run"] ---> Running in ca3994f70f7cRemoving intermediate container ca3994f70f7c ---> 053aedfa3ceaSuccessfully built 053aedfa3ceaSuccessfully tagged tomcat-base:v8.5.78[root@docker tomcat]# docker images tomcat-baseREPOSITORY    TAG       IMAGE ID       CREATED          SIZEtomcat-base   v8.5.78   053aedfa3cea   19 seconds ago   271MB#创建tomcat容器[root@docker tomcat]# docker run -d -p 8080:8080 tomcat-base:v8.5.78#测试验证root@ubuntu1804:/data/dockerfile/tomcat# curl 172.17.0.2:8080 -IHTTP/1.1 200Content-Type: text/html;charset=UTF-8Transfer-Encoding: chunkedDate: Fri, 13 May 2022 14:50:28 GMT

4、 Bridging is used to realize the interconnection of containers between different host computers.

#环境配置:Ubuntu1804  宿主机地址:10.0.0.151 容器地址:172.17.0.2centos7     宿主机地址:10.0.0.152 容器地址:172.17.0.3#两台宿主机安装网桥工具bridge-utilsroot@ubuntu1804:~# apt -y install bridge-utils[root@localhost ~]# yum -y install bridge-utils#将eth0加到网桥接口docker0上(此时会无法连接外网)root@ubuntu1804:~# brctl addif docker0 eth0[root@localhost ~]#brctl addif docker0 eth0#在两个宿主机上各启动一个容器,以需要确保两个容器IP不同,相互测试访问root@ubuntu1804:~# docker psCONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES6d0b5c840323   busybox   "sh"      57 seconds ago   Up 56 seconds             b1root@ubuntu1804:~# docker exec 6d hostname -i172.17.0.2[root@10 ~]# docker psCONTAINER ID   IMAGE     COMMAND   CREATED              STATUS              PORTS     NAMES83637fec6704   busybox   "sh"      About a minute ago   Up About a minute             b2d3f9eec36a40   busybox   "sh"      2 minutes ago        Up 2 minutes                  elastic_wescoff[root@10 ~]# docker exec 83 hostname -i172.17.0.3#在ubutu上测试ping172.17.0.3成功root@ubuntu1804:~# docker exec 6d ping 172.17.0.3