Linux-容器(二)

容器-容器架构自动化部分(二)

一、手动实现创建tengine镜像

1.流程

1. 下载并启动ubuntu:20.04 容器 叫 ubt_tengine_2.3.3
2. 配置apt源
3. 下载软件包
4. 编译安装3步曲 ./configure ; make ; make install
5. 启动与测试
6. 清理痕迹
7. 生成镜像

1.1 下载并启动ubuntu:20.04 容器 叫 ubt_tengine_2.3.3

[root@docker01 ~]# docker run -it --name 'ubt_tengine' ubuntu:20.04 /bin/bash
Unable to find image 'ubuntu:20.04' locally
20.04: Pulling from library/ubuntu
846c0b181fff: Pull complete 
Digest: sha256:b872b0383a2149196c67d16279f051c3e36f2acb32d7eb04ef364c8863c6264f
Status: Downloaded newer image for ubuntu:20.04
root@a3371923e4e9:/# 

1.2 配置apt源

root@a3371923e4e9:/# sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g'   /etc/apt/sources.list
root@a3371923e4e9:/# apt update

1.3 安装软件包

root@a3371923e4e9:/# apt -y install vim curl

1.4 编译安装

#复制包到容器
[root@docker01 ~]# docker cp tengine-2.3.3.tar.gz ubt_tengine:/tmp/
Successfully copied 2.85MB to ubt_tengine:/tmp/
#安装依赖
root@a3371923e4e9:/# apt install -y libssl-dev make gcc pcre2-utils   libpcre3-dev  zlib1g-dev
#进入目录进行配置
root@a3371923e4e9:/# cd /tmp
root@a3371923e4e9:/tmp# ll
total 2784
drwxrwxrwt 1 root root      34 Mar  7 12:19 ./
drwxr-xr-x 1 root root      50 Mar  7 12:16 ../
-rw-r--r-- 1 root root 2848144 Feb 17 01:37 tengine-2.3.3.tar.gz
root@a3371923e4e9:/tmp# tar xf tengine-2.3.3.tar.gz 
root@a3371923e4e9:/tmp# cd tengine-2.3.3
root@a3371923e4e9:/tmp/tengine-2.3.3# ./configure --prefix=/app/tools/tengine-2.3.3/  \
> --user=nginx \
> --group=nginx \
> --with-http_ssl_module \
> --with-http_v2_module   \
> --with-http_realip_module \
> --with-http_stub_status_module \
> --with-http_mp4_module \
> --with-stream  \
> --with-stream_ssl_module   \
> --with-stream_realip_module   \
> --add-module=modules/ngx_http_upstream_check_module/ \
> --add-module=modules/ngx_http_upstream_session_sticky_module
root@a3371923e4e9:/tmp/tengine-2.3.3# echo $?
0
#make编译
root@a3371923e4e9:/tmp/tengine-2.3.3# make  -j 1
root@a3371923e4e9:/tmp/tengine-2.3.3# echo $?
0
root@a3371923e4e9:/tmp/tengine-2.3.3# make install 
#创建软链接
root@a3371923e4e9:/tmp/tengine-2.3.3# ln -s /app/tools/tengine-2.3.3/  /app/tools/tengine

#添加用户nginx
root@a3371923e4e9:/tmp/tengine-2.3.3# useradd -s /sbin/nologin nginx 
root@a3371923e4e9:/tmp/tengine-2.3.3# id nginx
uid=1000(nginx) gid=1000(nginx) groups=1000(nginx)
#nginx命令软连接到/sbin/下面.
root@a3371923e4e9:/tmp/tengine-2.3.3# ln -s /app/tools/tengine/sbin/nginx  /sbin
root@a3371923e4e9:/tmp/tengine-2.3.3# nginx -v
Tengine version: Tengine/2.3.3
nginx version: nginx/1.18.0

1.5 启动与测试

root@a3371923e4e9:/tmp/tengine-2.3.3# nginx
root@a3371923e4e9:/tmp/tengine-2.3.3# curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to tengine!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to tengine!</h1>
<p>If you see this page, the tengine web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://tengine.taobao.org/">tengine.taobao.org</a>.</p>

<p><em>Thank you for using tengine.</em></p>
</body>
</html>

1.6 清理痕迹

root@a3371923e4e9:/tmp/tengine-2.3.3# cd /tmp/
root@a3371923e4e9:/tmp# rm -rf *

1.7 生成镜像

[root@docker01 ~]# docker commit ubt_tengine tengine:ubt20.04
sha256:144bdda15c0d37ce8abba3589f90e7498f3f3fd327c26fc227e18a1161034bb2
[root@docker01 ~]# docker images
REPOSITORY   TAG              IMAGE ID       CREATED         SIZE
tengine      ubt20.04         144bdda15c0d   5 seconds ago   357MB

#测试镜像
#启动容器容器中,要有个服务在前台阻塞住.
#这个容器中没有配置的.
#需要手动指定.
[root@docker01 ~]# docker run -d -p 81:80 tengine:ubt20.04 nginx -g "daemon off;"


nginx -g用于在命令行中指定配置文件中的选项/指令,要以分号结尾.
daemon off 关闭守护进程模式,前台运行

二、自动实现Dockerfile实现

1.Dockerfile概述

应用场景: 通过1个文件Dockerfile,生成自定义 镜像

为何使用Dockerfile:

我们目前都是手动拉取镜像,手动进行配置,手动安装依赖,手动编译安装,创建用户....,这个过程类似于命令行使用ansible模块(繁 琐,不方便重复执行). 书写Dockerfile把之前手动创建自定义镜像的过程,通过Dockerfile里面的指令实现.类似于书写playbook.

Dockerfile用于根据要求自动创建 镜像

2.Dockerfile指令

指令都是大写.

Dockerfile指令 含义 应用 建议
开头部 分
FROM 指定基本镜像类似于 docker pull 下载镜像 FROM ubuntu:20.04 尽量少写ubuntu或 ubuntu:latest,尽量指定具体的版 本.
LABEL 用于指定容器的属性信息,作者,个人联系方式(邮件) LABEL author="wh" 推荐使用LABEL,不推荐使用下面的 MAINTAINER
MAINTAINER 不再使用,推荐使用LABEL 个人信息
ENV 用于创建Dockerfile中使用的变量 ENV Tengine_Version空格2.3.3 软件版本可以创建使用变量.
中间处 理部分
RUN 制作镜像过程中需要的执行命令,通常系统配置,服务配置,部署。 但不能出现阻塞当前终端的命令。 RUN 系统命令即可 不建议使用连续多个RUN,合并连续多 个RUN.
ADD 可以把指定文件或目录拷贝到容器中(指定目录),会解压压缩包. 相对于当前目录 ADD restart.tar.gz空 格/app/code/restart/ 拷贝压缩包使用.
COPY 可以把指定文件或目录拷贝到容器中(指定目录),不支持自动解压. 相对于当前目录. COPY nginx.conf空格 /etc/nginx/nginx.conf 拷贝文件或目录.
WORKDIR 指定 容器 的默认工作目录 WORKDIR /app/code/restart/ ADD restart.tar.gz空 一般用于配合ADD,COPY需要书写容器 中路径指令. Dockerfile中使用相对路径操作容 器
VOLUME 挂载数据卷. VOLUME /usr/share/nginx/html 创建随机数据卷挂载容器的目录. 未来推荐docker run的时候指定 -v 即可.
结尾部 分书写的内容
EXPOSE 指定镜像要对外暴露的端口 EXPOSE 80 用于指定一个或多个容器的端口. 未来这个端口可以被-P识别. xxxx:80
CMD 用于指定容器的入口命令.入口命令可以在docker run的时候替换.运行镜像 启动容器的时候,容器默认运行的命令是什么. CMD ["命令","参数01","参数02"] CMD ["nginx","-g","daemon off;"] 大部分都会使用CMD.
ENTRYPOINT 用于指定容器的入口命令.无法被docker run替换, dockerrun指定的时候仅 仅作为 entrypoint命令的参数而已. ENTRYPOINT ["executable", "param1", "param2"] 使用不多.

3. 编译安装tengine变成Dockerfile

[root@docker01 /app/docker/dockerfile/tengine_ubt_bird]# ll
total 2880
-rw-r--r-- 1 root root   91580 Mar  7 15:29 bird.tar.gz
-rw-r--r-- 1 root root    1287 Mar  7 15:55 Dockerfile
-rw-r--r-- 1 root root 2848144 Mar  7 15:51 tengine-2.3.3.tar.gz

[root@docker01 /app/docker/dockerfile/tengine_ubt_bird]# cat Dockerfile 
#1.基本信息
FROM ubuntu:20.04
LABEL author="wh" \
      desc="bird"

#2.传输软件包
ADD tengine-2.3.3.tar.gz /tmp/

#3.环境准备
RUN  sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g'   /etc/apt/sources.list  \
     && apt update  \
     && apt install -y libssl-dev make gcc pcre2-utils   libpcre3-dev  zlib1g-dev \
     && cd /tmp/tengine-2.3.3/ \
     && ./configure --prefix=/app/tools/tengine-2.3.3/  \
         --user=nginx \
         --group=nginx \
         --with-http_ssl_module \
         --with-http_v2_module   \
         --with-http_realip_module \
         --with-http_stub_status_module \
         --with-http_mp4_module \
         --with-stream  \
         --with-stream_ssl_module   \
         --with-stream_realip_module   \
         --add-module=modules/ngx_http_upstream_check_module/ \
         --add-module=modules/ngx_http_upstream_session_sticky_module \
     && make -j  1 \
     && make install \
     && ln -s /app/tools/tengine-2.3.3/ /app/tools/tengine \
     && ln -s /app/tools/tengine/sbin/nginx /sbin/ \
     && useradd -s /sbin/nologin nginx

#传输代码
ADD bird.tar.gz /app/tools/tengine/html

#清理
RUN rm -rf /tmp/* /var/cache/*

#暴露端口和设置入口指令
EXPOSE 80
CMD [ "nginx","-g","daemon off;" ] 

4.案例: 多服务镜像nginx+php

[root@docker01 /app/docker/dockerfile/nginx_php]# ll
total 21708
-rw-r--r-- 1 root root      467 Mar  8 10:24 Dockerfile
-rw-r--r-- 1 root root       45 Mar  8 10:14 entrypoint.sh
-rw-r--r-- 1 root root 22218170 Mar  8 10:06 ngx-dep-php72w.tar.gz

[root@docker01 /app/docker/dockerfile/nginx_php]# cat Dockerfile 
FROM centos:7
LABEL author="wh" \
	desc="nginx+php"

#拷贝压缩包
ADD ngx-dep-php72w.tar.gz /tmp/
COPY entrypoint.sh /


RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo \
	&& curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo \
	&& yum -y localinstall /tmp/*.rpm  \
	&& sed -i "s#apache#nginx#g" /etc/php-fpm.d/www.conf 
RUN chmod 755 /entrypoint.sh
	
EXPOSE 80 
CMD  ["/entrypoint.sh"]

[root@docker01 /app/docker/dockerfile/nginx_php]# cat entrypoint.sh 
#!/bin/bash

php-fpm

nginx -g "daemon off;"

#注:#!/bin/bash必须写

5.案例 部署可道云

[root@docker01 /app/docker/dockerfile/php_nginx_kodexp]# ll
total 13668
-rw-r--r-- 1 root root      228 Mar  8 14:31 Dockerfile
-rw-r--r-- 1 root root      310 Mar  8 11:47 kod.cn.conf
-rw-r--r-- 1 root root 13983417 Mar  8 11:44 kodexp.tar.gz
-rw-r--r-- 1 root root      653 Mar  8 11:46 nginx.conf
[root@docker01 /app/docker/dockerfile/php_nginx_kodexp]# cat Dockerfile 
FROM web:nginx_php
LABEL author="wh" \
	desc="kodexp"

COPY nginx.conf /etc/nginx/nginx.conf
COPY kod.cn.conf /etc/nginx/conf.d

ADD kodexp.tar.gz /app/code

RUN chown -R nginx.nginx /app/code

EXPOSE 80

CMD ["/entrypoint.sh"]

[root@docker01 /app/docker/dockerfile/php_nginx_kodexp]# cat nginx.conf 
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;
    ##
    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

[root@docker01 /app/docker/dockerfile/php_nginx_kodexp]# cat kod.cn.conf 
server {
  listen 80;
  server_name kod.cn;
  root /app/code/kodexp;
  location / {
    index index.php;
  }

  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;

  }

}

6.CMD与ENTRYPOINT

指令 CMD ENTRYPOINT
共同点 用于设置容器入口命令 容器启动后默认运行什么指令什么参数 用于设置容器入口命令 容器启动后默认运行什么指令什么参数
共同点 CMD ["命令","参数1","参数2"] ENTRYPOINT ["命令","参数1","参数2"]
区别(非同时使用) 用户通过docker run/exec启动进入容 器的时候,指定了命令.
这个命令会替代CMD命令和参数.
用户通过docker run/exec启动进入容器的时候,指定了命令.
指定的命令,选项会成为ENTRYPOINT命令的参数
区别(一起使用) CMD写的入口命令和命令的选项.(可以被 替换) 入口的指令不可替换. 一般指定脚本,脚本用于判断用户docker run/exec的时候是否输入了命令.
如果没加 docker run -d nginx:1.20.2,直接运行CMD.
如果加了,则运行对应的命令和选项.
#单独使用,也就是Dockerfile里只有一个指令时
docker run -d --name "test" -p 80:80 nginx:alpine sleep  999
#CMD方式:替换原有的指令
CMD [ "nginx","-g","daemon off;" ] 
不会继续运行这个CMD里的nginx -g "daemon off;" ,运行sleep 999命令

#ENTRYPOINT方式:追加 
ENTRYPOINT [ "nginx","-g","daemon off;" ] 
命令就会变成    nginx -g "daemon off;" sleep 999

#同时使用,在1个dockerfile中同时使用
ENTRYPOINT ["/entrypoint.sh"]
CMD [ "nginx","-g","daemon off;" ] 

#启动容器的时候什么都不加
docker run -d --name "test" -p 80:80 nginx:alpine /entrypoint.sh nginx -g "daemon off;"

#启动容器的时候加上了sleep 999
docker run -d --name "test" -p 80:80 nginx:alpine /entrypoint.sh sleep 999

7.多阶段提交

目前使用多节点提交实现:

编译安装一些软件的时候,一般是先安装各种依赖,然后开始编译安装,编译安装一般会生成新的命令.

1个镜像负责编译安装,生成命令.(临时)

1个镜像上一个镜像的命令复制过来+服务必要的配置.

最终使用最后的这个镜像.

tengine+type项目多阶段提交

  1. 创建镜像的时候起个别名 FROM xxx AS temp
  2. 对中间镜像进行操作,下载依赖,下载软件包,编译....
  3. 创建镜像 FROM ubuntu:20.04
  4. 把中间镜像的命令,配置文件/目录复制到最终镜像中.
  5. 复制代码
  6. EXPOSE 80, 设置入口指令CMD....
[root@docker01 /app/docker/dockerfile/tengine_ubt_bird]# ll
total 2880
-rw-r--r-- 1 root root   91580 Mar  7 15:29 bird.tar.gz
-rw-r--r-- 1 root root    1535 Mar  8 15:17 Dockerfile
-rw-r--r-- 1 root root 2848144 Mar  7 15:51 tengine-2.3.3.tar.gz

[root@docker01 /app/docker/dockerfile/tengine_ubt_bird]# cat Dockerfile 

FROM ubuntu:20.04 AS TEMP
LABEL author="wh" \
      desc="多模块" 

ENV WEB_SERVER=tengine-2.3.3
ENV INSTALL_DIR=/app/tools/${WEB_SERVER}
ENV NGX_USER=nginx
ENV CPU_CORES=1



ADD tengine-2.3.3.tar.gz   /tmp/

RUN  sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g'   /etc/apt/sources.list  \
     && apt update  \
     && apt install -y libssl-dev make gcc pcre2-utils   libpcre3-dev  zlib1g-dev \
     && cd /tmp/tengine-2.3.3/ \
     && ./configure --prefix=${INSTALL_DIR}  \
         --user=${NGX_USER} \
         --group=${NGX_USER} \
         --with-http_ssl_module \
         --with-http_v2_module   \
         --with-http_realip_module \
         --with-http_stub_status_module \
         --with-http_mp4_module \
         --with-stream  \
         --with-stream_ssl_module   \
         --with-stream_realip_module   \
         --add-module=modules/ngx_http_upstream_check_module/ \
         --add-module=modules/ngx_http_upstream_session_sticky_module \
     && make -j ${CPU_CORES} \
     && make install

FROM  ubuntu:20.04 

COPY  --from=TEMP  /app/   /app/

RUN  sed -ri 's#archive.ubuntu.com|security.ubuntu.com#mirrors.aliyun.com#g'   /etc/apt/sources.list  \
     && apt update  
RUN   apt install -y libssl-dev  pcre2-utils   libpcre3-dev  zlib1g-dev 

RUN  ln -s /app/tools/tengine-2.3.3/ /app/tools/tengine \
     && ln -s /app/tools/tengine/sbin/nginx /sbin/ \
     && useradd -s /sbin/nologin nginx

ADD bird.tar.gz /app/tools/tengine/html

EXPOSE 80

CMD [ "nginx","-g","daemon off;" ]

8. dockerfile

生产环境应用建议 说明
尽量保证每个镜像功能单一 尽量避免多个服务运行在同一个镜像中.
选择合适的基础镜像 不一定都要从头做(系统,ngx,tengine,tomcat,jdk)
注释与说明 添加一定的注释和镜像属性信息(LABEL)
指定版本号 使用镜像的时候指定版本,nginx:latest php:latest nginx:1.20.2-alpine
减少镜像层数/步骤 尽可能合并RUN,ADD,COPY
记得收尾 清理垃圾,记得清理缓存,临时文件,压缩包....
合理使用.dockerignore 构建的忽略的文件(了解),少传输些文件.(有时会在Dockerfile同目录里有一些无用的东西,要把这些东西忽略)

1.案例 分离式 nginx+php+可道云

#准备代码目录
[root@docker01 /app/docker/dockerfile]# mkdir -p kodexp/{conf,code}
[root@docker01 /app/docker/dockerfile]# cd kodexp/
[root@docker01 /app/docker/dockerfile/kodexp]# tar xf kodexp.tar.gz 
[root@docker01 /app/docker/dockerfile/kodexp]# ll
total 13656
drwxr-xr-x 2 root root        6 Mar  8 20:05 code
drwxr-xr-x 2 root root       43 Mar  8 20:06 conf
drwxr-xr-x 7 root root      126 Mar  8 11:44 kodexp
-rw-r--r-- 1 root root 13983417 Mar  8 11:44 kodexp.tar.gz
[root@docker01 /app/docker/dockerfile/kodexp]# mv kodexp/* code
[root@docker01 /app/docker/dockerfile/kodexp]# ll code
total 104
drwxr-xr-x 10 root root   115 Nov 17 14:08 app
-rw-r--r--  1 root root 91801 Nov 17 14:08 ChangeLog.md
drwxr-xr-x  3 root root    74 Nov 17 14:08 config
drwxr-xr-x  7 root root    72 Nov 17 14:08 data
-rw-r--r--  1 root root   118 Nov 17 14:08 index.php
drwxr-xr-x 15 root root   218 Nov 17 14:08 plugins
-rw-r--r--  1 root root  8074 Nov 17 14:08 README.MD
drwxr-xr-x  6 root root    57 Nov 17 14:08 static
#准备配置文件
[root@docker01 /app/docker/dockerfile/kodexp/conf]# cat kod.cn.conf 
server {
  listen 80;
  server_name kod.cn;
  root /app/code/kodexp;
  location / {
    index index.php;
  }

  location ~ \.php$ {
  #互联容器的别名 php
    fastcgi_pass php:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;

  }

}

[root@docker01 /app/docker/dockerfile/kodexp/conf]# cat nginx.conf 
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;
    ##
    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
#php配置文件
[root@docker01 /app/docker/dockerfile/kodexp/conf]# cat www.conf 
[www]
user = www-data
group = www-data
listen = 0.0.0.0:9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

#修改代码目录权限
[root@docker01 /app/docker/dockerfile/kodexp]# chmod -R 777 code

#准备nginx和php容器
[root@docker01 /app/docker/dockerfile/kodexp]# docker pull nginx:1.22.1-alpine
[root@docker01 /app/docker/dockerfile/kodexp]# docker pull php:7-fpm-alpine

#启动php容器
[root@docker01 /app/docker/dockerfile/kodexp]# docker run -d --name "kodexp_php" \
> -v /app/docker/dockerfile/kodexp/conf/www.conf:/usr/local/etc/php-fpm.d/www.conf \
> -v /app/docker/dockerfile/kodexp/code:/app/code/kodexp \
> php:7-fpm-alpine
aa9c480edef00ac668fa1e97b5a42e456f7d66a9e6bfdeddb24b63e98455687b


#启动nginx容器
[root@docker01 /app/docker/dockerfile/kodexp]# docker run -d -p 80:80 --name "kodexp_nginx" \
> --link kodexp_php:php \
> -v /app/docker/dockerfile/kodexp/conf/nginx.conf:/etc/nginx/nginx.conf \
> -v /app/docker/dockerfile/kodexp/conf/kod.cn.conf:/etc/nginx/conf.d/kod.cn.conf \
> -v /app/docker/dockerfile/kodexp/code:/app/code/kodexp \
> nginx:1.22.1-alpine
9c02ff66299a7da467469dd37f5e0776c87c238604f73983c99ed2b3c237fa5e


[root@docker01 /app/docker/dockerfile/kodexp]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED              STATUS              PORTS                               NAMES
9c02ff66299a   nginx:1.22.1-alpine   "/docker-entrypoint.…"   54 seconds ago       Up 53 seconds       0.0.0.0:80->80/tcp, :::80->80/tcp   kodexp_nginx
aa9c480edef0   php:7-fpm-alpine      "docker-php-entrypoi…"   About a minute ago   Up About a minute   9000/tcp                            kodexp_php

补充

解决登录提示php环境缺少依赖 gd

##debian系统
FROM php:7.4-fpm
RUN apt-get update && apt-get install -y \
		libfreetype6-dev \
		libjpeg62-turbo-dev \
		libpng-dev \
	&& docker-php-ext-configure gd --with-freetype --with-jpeg \
	&& docker-php-ext-install -j$(nproc) gd

练习

部署zrlog

[root@docker01 /app/docker/dockerfile/zrlog/conf]# docker run -d -p 8080:8080 --name "zrlog_tomcat" \
> -v /app/docker/dockerfile/zrlog/ROOT.war:/usr/local/tomcat/webapps/ROOT.war \
> tomcat:9.0.52-jre8
[root@docker01 /app/docker/dockerfile/zrlog/conf]# docker pull tomcat:9.0.52-jre8

部署wordpress

[root@docker01 /app/docker/dockerfile/wordpress]# mv wordpress/* code
[root@docker01 /app/docker/dockerfile/wordpress]# chmod -R 777 code

[root@docker01 /app/docker/dockerfile/wordpress]# docker run -d --name "wordpress_php" \
> -v /app/docker/dockerfile/wordpress/conf/www.conf:/usr/local/etc/php-fpm.d/www.conf \
> -v /app/docker/dockerfile/wordpress/code:/app/code/wordpress \
> php:7-fpm-alpine
[root@docker01 /app/docker/dockerfile/wordpress]# cat /app/docker/dockerfile/wordpress/conf/wordpress.cn.conf
server {
  listen 80;
  server_name wordpress.cn;
  root /app/code/wordpress;
  location / {
    index index.php;
  }

  location ~ \.php$ {
    fastcgi_pass php:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
  }

}


[root@docker01 /app/docker/dockerfile/wordpress]# docker run -d -p 80:80 --name "wordpress_nginx" \
> --link wordpress_php:php \
> -v /app/docker/dockerfile/wordpress/conf/nginx.conf:/etc/nginx/nginx.conf \
> -v /app/docker/dockerfile/wordpress/conf/wordpress.cn.conf:/etc/nginx/conf.d/wordpress.cn.conf \
> -v /app/docker/dockerfile/wordpress/code:/app/code/wordpress \
> nginx:1.22.1-alpine

四、Docker Compose

单机容器编排工具

  • docker compose

容器集群管理

  • ansible+docker compose+dockerfile
  • docker swarm实现集群管理.
  • mesos
  • 通过k8s kubernetes(船舵)实现集群管理

1.docker-compose极速上手指南

[root@docker01 ~]# yum -y install  docker-compose
[root@docker01 ~]# mkdir -p /app/docker/compose/

2.案例 初步上手docker-compose

docker-compose默认文件名: docker-compose.yaml 或docker-compose.yml

[root@docker01 /app/docker/compose/nginx]# cat docker-compose.yml 
version: "3.3"
services:
  nginx_compose:
    image: "nginx:1.22.1-alpine"
    ports:
      - "80:80"
命令格式
容器
up -d up == run 创建并运行容器 启动的时候后台运行类似于docker run -d
down 关闭容器,删除容器,及相关资源. (慎用)
stop/start/restart docker container 关闭、开启、重启容器。
ps 查看容器运行情况 只有-q选项
top 容器进程信息
logs 容器日志
rm 删除容器(需要容器已经关闭)
镜像
images 查看镜像

注意事项

如果docker-compose简单修改端口,数据卷.docker-compose up -d 会自动识别,重新创建容器.
如果容器的名字也改了,会造成新旧容器的端口冲突,会失败. 可以 up -d remove-orphans 删除之前容器或失效容器.

3. compose文件的常用指令

depends_on: 依赖,先启动指定的容器然后再启动当前容器.

volumes: 数据卷

links: 容器连接,本质hosts解析.

4.案例 docker-compose部署kodexp

[root@docker01 /app/docker/compose/kodexp]# ll
total 4
drwxrwxrwx 7 root root 126 Mar  9 10:31 code
drwxr-xr-x 2 root root  59 Mar  9 10:53 conf
-rw-r--r-- 1 root root 485 Mar  9 10:58 docker-compose.yml
[root@docker01 /app/docker/compose/kodexp]# cat docker-compose.yml 
version: "3.3"
services:
#容器的名字
  kodexp_php:
  #镜像
    image: "php:7-fpm-alpine"
  #挂载卷
    volumes:
      - "./conf/www.conf:/usr/local/etc/php-fpm.d/www.conf"
      - "./code:/app/code/kodexp"
  #容器的名字
  kodexp_nginx:
    image: "nginx:1.22.1-alpine"
    ports: 
      - "8088:80"
   #容器连接
    links:
      - "kodexp_php:php"
    depends_on:
   #依赖
      - "kodexp_php"
    volumes:
      - "./conf/nginx.conf:/etc/nginx/nginx.conf"
      - "./conf/kod.cn.conf:/etc/nginx/conf.d/kod.cn.conf"
      - "./code:/app/code/kodexp"
[root@docker01 /app/docker/compose/kodexp]# docker-compose up -d
[root@docker01 /app/docker/compose/kodexp]# docker-compose ps
        Name                       Command               State    Ports
-----------------------------------------------------------------------
kodexp_kodexp_nginx_1   /docker-entrypoint.sh ngin ...   Exit 0        
kodexp_kodexp_php_1     docker-php-entrypoint php-fpm    Exit 0    

5.docker-compose与dockerfile

[root@docker01 /app/docker/compose/bird]# cat Dockerfile 
#1.基本信息
FROM nginx:alpine
LABEL author="wh" \
      desc="bird"

ADD bird.tar.gz /usr/share/nginx/html


#暴露端口和设置入口指令
EXPOSE 80
CMD [ "nginx","-g","daemon off;" ] 

[root@docker01 /app/docker/compose/bird]# cat docker-compose.yml 
version: "3.3"
services:
#容器名字
 ngx_bird:
 #执行构造镜像
   build: .
 #镜像名字
   image: "web:ngx_bird"
   ports:
      - "80:80"
      
[root@docker01 /app/docker/compose/bird]# docker-compose up -d
Building ngx_bird
Step 1/5 : FROM nginx:alpine
 ---> 2bc7edbc3cf2
Step 2/5 : LABEL author="wh"       desc="bird"
 ---> Running in 2cb46a5b7bd2
Removing intermediate container 2cb46a5b7bd2
 ---> 6a554442356a
Step 3/5 : ADD bird.tar.gz /usr/share/nginx/html
 ---> 3a29b13e1219
Step 4/5 : EXPOSE 80
 ---> Running in b8259d68893b
Removing intermediate container b8259d68893b
 ---> 8208ade895f5
Step 5/5 : CMD [ "nginx","-g","daemon off;" ]
 ---> Running in df1964ceb672
Removing intermediate container df1964ceb672
 ---> 7a728380c533

Successfully built 7a728380c533
Successfully tagged web:ngx_bird
WARNING: Image for service ngx_bird was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating bird_ngx_bird_1 ... done

[root@docker01 /app/docker/dockerfile/tengine_ubt_bird_bak]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS              PORTS                               NAMES
cf86d4d34055   web:ngx_bird   "/docker-entrypoint.…"   2 minutes ago   Up About a minute   0.0.0.0:80->80/tcp, :::80->80/tcp   bird_ngx_bird_1

五、docker镜像仓库之registry仓库

1.仓库选型与概述

docker镜像仓库方案 应用场景与特点
镜像保存为压缩包 使用的时候,sl(save/load),仅适用于节点极少的情况.很不方便.
registry镜像仓库 使用方便,适用于小型网站集群.(镜像不多,环境不复杂),命令行操作.
harbor镜像仓库 企业级镜像仓库(docker,k8s)都可用,图形化页面
公有云的镜像服务 在公有云上申请个人,企业.

2.环境准备

#修改hosts
[root@docker01 ~]# cat /etc/hosts
10.0.0.81 docker01.cn
10.0.0.82 docker02.cn reg.cn

[root@docker02 ~]# cat /etc/hosts
10.0.0.81 docker01.cn
10.0.0.82 docker02.cn reg.cn

3.极速上手指南

#下载registry   #镜像仓库服务器配置
[root@docker02 ~]# docker pull registry

#配置(docker服务端准许使用http) (所有使用私有镜像仓库的节点都要配置)
[root@docker01 ~]# cat /etc/docker/daemon.json 
{
    "registry-mirrors": [ "华为云加速地址" ],
    "insecure-registries": ["reg.cn"]   #修改这个域名
}

#注意第2行结尾的逗号  

#使用启动registry指定端口号5000:5000
[root@docker02 ~]# docker volume create registry 
[root@docker02 ~]# docker volume ls 
[root@docker02 ~]# docker run -d  --name "registry"   -p 5000:5000 -v registry:/var/lib/registry  \
> --restart=always registry:latest

#docker01使用,先修改标签为仓库的地址,然后push
[root@docker01 /app/docker/compose/kodexp]# docker tag nginx:1.22.1-alpine reg.cn:5000/wh/nginx:1.22
[root@docker01 /app/docker/compose/kodexp]# docker push reg.cn:5000/wh/nginx:1.22
The push refers to repository [reg.cn:5000/wh/nginx]
7fbf7f6957d5: Pushed 
7ef61094715c: Pushed 
98e71313b6c2: Pushed 
78bf1b847806: Pushed 
d58d318d37eb: Pushed 
aa5968d388b8: Pushed 
1.22: digest: sha256:ff2a5d557ca22fa93669f5e70cfbeefda32b98f8fd3d33b38028c582d700f93a size: 1568
#进行查看
[root@docker02 ~]# curl -L 10.0.0.82:5000/v2/_catalog
{"repositories":["wh/nginx"]}

#下载镜像
[root@docker02 ~]# docker pull reg.cn:5000/wh/nginx:1.22

4.把启动registry写成docker compose

[root@docker02 /app/docker/compose/registry]# cat docker-compose.yml 
version: "3.3"
services:
  wh_registry:
     #容器名字
     container_name: "wh_reg"
     #镜像名字
     image: "registry:latest"
     ports:
       - "5000:5000"
     restart: always
     #引用卷
     volumes:
       - "registry:/var/lib/registry"
#创建卷
volumes:
 registry:
[root@docker02 /app/docker/compose/registry]# docker-compose up -d
Creating network "registry_default" with the default driver
Creating volume "registry_registry" with default driver
Creating wh_reg ... done

六、 docker企业级镜像仓库-harbor仓库

1.环境准备

由于harbor的包挺大,需要1核2G的空间

公有云的软件下载的地址:
https://github.com/goharbor/harbor/releases/download/v2.7.1/harbor-offline-installer-v2.7.1.tgz

需要安装docker和docker-compose

[root@docker02 ~]# ll
total 770352
-rw-r--r--  1 root root 629571428 Mar  9 14:36 harbor-offline-installer-v2.3.1.tgz
[root@docker02 ~]# mkdir /app/tools
[root@docker02 ~]# tar xf harbor-offline-installer-v2.3.1.tgz -C /app/tools
[root@docker02 /app/tools/harbor]# ll
total 618140
drwxr-xr-x 3 root root        20 Mar  9 15:16 common
-rw-r--r-- 1 root root      3361 Jul 19  2021 common.sh
-rw-r--r-- 1 root root      5996 Mar  9 15:18 docker-compose.yml
-rw-r--r-- 1 root root 632922189 Jul 19  2021 harbor.v2.3.1.tar.gz
-rw-r--r-- 1 root root      7840 Jul 19  2021 harbor.yml.tmpl
-rwxr-xr-x 1 root root      2500 Jul 19  2021 install.sh
-rw-r--r-- 1 root root     11347 Jul 19  2021 LICENSE
-rwxr-xr-x 1 root root      1881 Jul 19  2021 prepare
[root@docker02 /app/tools/harbor]# cp harbor.yml.tmpl harbor.yml
#修改harbor.yml文件
[root@docker02 /app/tools/harbor]# cat -n  harbor.yml
     1	# Configuration file of Harbor
     2	
     3	# The IP address or hostname to access admin UI and registry service.
     4	# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
     ####################修改第5行为自己的域名
     hostname: harbor.cn
     5	#hostname: reg.mydomain.com    
     6	
     7	# http related config
     8	http:
     9	  # port for http, default is 80. If https enabled, this port will redirect to https port
    10	  port: 80
    11	
    ##################注释13,15,17,18行
    12	# https related config
    13	#https:
    14	  # https port for harbor, default is 443
    15	 # port: 443
    16	  # The path of cert and key files for nginx
    17	  #certificate: /your/certificate/path
    18	  #private_key: /your/private/key/path
    19	
    20	# # Uncomment following will enable tls communication between all harbor components
    21	# internal_tls:
    22	#   # set enabled to true means internal tls is enabled
    23	#   enabled: true
    24	#   # put your cert and key files on dir
    25	#   dir: /etc/harbor/tls/internal
    26	
    27	# Uncomment external_url if you want to enable external proxy
    28	# And when it enabled the hostname will no longer used
    29	# external_url: https://reg.mydomain.com:8433
    30	
    31	# The initial password of Harbor admin
    32	# It only works in first time to install harbor
    33	# Remember Change the admin password from UI after launching Harbor.
    ##############修改第34行的密码
    harbor_admin_password:admin
    34	#harbor_admin_password: Harbor12345
    
#执行install
[root@docker02 /app/tools/harbor]# ./install.sh 
#注意要检查80是否被占用
#提示successfully成功
? ----Harbor has been installed and started successfully.----

#修改上传镜像服务器的docker配置
[root@docker01 ~]# cat /etc/docker/daemon.json 
{
    "registry-mirrors": [ "华为云加速地址" ],
    "insecure-registries": ["harbor.cn"]
}
[root@docker01 ~]# systemctl restart docker

#docker01测试上传
[root@docker01 /app/docker/compose/kodexp]# docker login -uadmin -padmin harbor.cn
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@docker01 /app/docker/compose/kodexp]# docker tag nginx:1.22.1-alpine harbor.cn/library/nginx:1.22
[root@docker01 /app/docker/compose/kodexp]# docker push harbor.cn/library/nginx:1.22
The push refers to repository [harbor.cn/library/nginx]
7fbf7f6957d5: Pushed 
7ef61094715c: Pushed 
98e71313b6c2: Pushed 
78bf1b847806: Pushed 
d58d318d37eb: Pushed 
aa5968d388b8: Pushed 
1.22: digest: sha256:ff2a5d557ca22fa93669f5e70cfbeefda32b98f8fd3d33b38028c582d700f93a size: 1568
[root@docker01 /app/docker/compose/kodexp]# 

image

2.故障

2.1 harbor提示"no such host"

image

原因:
1.没有做host解析
2.harbor.yml 文件的第5行的域名不对
解决:
1.查看/etc/hosts
2.修改harbor.yml重新install一下,

2.2 harbor提示"connect: connection refused"

[root@docker01 ~]# docker login -uadmin -padmin harbor.cn
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://harbor.cn/v2/": dial tcp 10.0.0.82:443: connect: connection refused
#原因:
/etc/docker/daemon.json 没有加  "insecure-registries": ["harbor.cn"]
#解决:
[root@docker01 ~]# cat /etc/docker/daemon.json 
{
    "registry-mirrors": [ "华为云加速地址" ],
    "insecure-registries": ["harbor.cn"]
}
[root@docker01 ~]# systemctl restart docker

2.3 docker提示"because start of the service was attempted too often"

[root@docker01 ~]# systemctl restart docker
Job for docker.service failed because start of the service was attempted too often. See "systemctl status docker.service" and "journalctl -xe" for details.
To force a start use "systemctl reset-failed docker.service" followed by "systemctl start docker.service" again.

[root@docker01 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: failed (Result: start-limit) since Thu 2023-03-09 20:18:32 CST; 26s ago
     Docs: https://docs.docker.com
  Process: 4872 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
 Main PID: 4872 (code=exited, status=1/FAILURE)

Mar 09 20:18:30 docker01 systemd[1]: docker.service failed.
Mar 09 20:18:32 docker01 systemd[1]: docker.service holdoff time over, scheduling restart.
Mar 09 20:18:32 docker01 systemd[1]: Stopped Docker Application Container Engine.
Mar 09 20:18:32 docker01 systemd[1]: start request repeated too quickly for docker.service
Mar 09 20:18:32 docker01 systemd[1]: Failed to start Docker Application Container Engine.
Mar 09 20:18:32 docker01 systemd[1]: Unit docker.service entered failed state.
Mar 09 20:18:32 docker01 systemd[1]: docker.service failed.
Mar 09 20:18:40 docker01 systemd[1]: start request repeated too quickly for docker.service
Mar 09 20:18:40 docker01 systemd[1]: Failed to start Docker Application Container Engine.
Mar 09 20:18:40 docker01 systemd[1]: docker.service failed.

#原因:
#重启docker的时候需要点时间

2.4 docker-compose 提示 "you're using the wrong Compose file version"

[root@aliyun bbs-go-master]# docker-compose pull
ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/
[root@aliyun bbs-go-master]# cat docker-compose.yml 
version: '3.8'


原因:
docker-compose:1.25.5 才支持docker-compose3.8
解决:
2.16.0
[root@aliyun ~]# wget https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64

[root@aliyun tools]# mv /usr/bin/docker-compose /usr/bin/docker-compose_bak
[root@aliyun tools]# ll
total 46592
-rwxr-xr-x 1 root root 47706112 Mar 11 18:13 docker-compose-linux-x86_64
[root@aliyun tools]# chmod +x /app/tools/docker-compose-linux-x86_64
[root@aliyun tools]# ln -s /app/tools/docker-compose-linux-x86_64 /usr/bin/docker-compose
[root@aliyun tools]# docker-compose -v
Docker Compose version v2.16.0

posted @ 2023-03-13 17:26  wh459086748  阅读(626)  评论(2)    收藏  举报