1. ==编写Dockerfile注意项==#

  1. 容器启动的时候,root账号是不会读取/etc/profile的,如果是root登录会找不到java变量
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib
ENV PATH $PATH:$JAVA_HOME/bin
  1. 容器的时区,和宿主机可能不一样
RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Aisa/Shanghai /etc/localtime 
  1. 目录结构按照业务类型或系统类型等方式划分,方便后期镜像比较多的时候进行分类
mkdir -pv /opt/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,redhat,alpine}}
  1. 写Dockerfile的时候可以写一个脚本,来执行docker build -t
vim build-command.sh
#!/bin/bash 
TAG=$1
7.8.2003
docker build -t harbor.123asd.com/docker/centos:${TAG} . 

bash build-command.sh 2024-01-01_10-10-45
  1. 注意权限,编译使用默认是root用户
  2. -p 容器里面的用户是nginx 宿主机的端口最好大于1024,(有些容器不允许使用1024)
  3. RUN useradd nginx USER nginx
    进去以后是$ 进去以后不是#
  4. WORKDIR 工作目录(可以使用相对路径)
  5. ENTRYPOINT ["/apps/tomcat/bin/run_tomcat.sh"] ENTRYPOINT [“nginx”,"-g",“daemon off;”] 和CMD混用 ENTRYPOINT [“nginx”] CMD ["-g",“daemon off;”]
  6. ENTRYPOINT [“docker-entrypoint.sh”] + [“mysqld”] docker-entrypoint.sh mysqld 混合使用的时候会将CMD的命令当做参数传递给ENTRYPOINT后面的脚本可以在脚本中对参数做判断并响应容器的初始化操作
  7. ENTRYPOINT [“top”,"-b"] CMD ["-c"] 等价于 ENTRYPOINT [“top”,"-b","-c"]

2. Dockerfile基本语法#

dockerfile制作镜像的最标准的方法 可以在vscode里面写,安装插件docker插件 名字一般都为 Dockerfile (不然构建的时候找不到文件,可以加参数-f 文件名 来进行构建)

  • 编写vim Dockerfile
  • 构建docker build .
  • docker build -f dockerfile.txt .
  • docker in
  1. ==FROM== 在整个dockerfile文件中,除了注释之外的第一行,要是FROM,用于指定父镜像
  2. ==ADD== 用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,会自动解压tar.gz格式的压缩包(其他格式的压缩包不会解压zip,镜像里面没有unzip)
  3. ==COPY== 用于添加宿主机本地的文件、目录、压缩等资源到镜像里面去,不会解压任何资源包
  4. ==LABEL== 设置镜像属性标签 ,(作者信息邮箱)
  5. ==ENV== 设置容器环境变量
  6. ==USER== 指定运行操作的用户(不声明就是root用户)
  7. ==RUN== 执行shell命令(记得加-y)
  8. ==VOLUME== 定义volume(一般-v会自动创建)
  9. ==WORKDIR== 用于定义工作目录(也可以&& cd)
  10. ==EXPOSE== 声明要映射的端口 ,
  11. ==CMD== 镜像启动为容器时候的默认命令或者脚本
  12. ==ENTRYPOINT== 如果有CMD CMD的值会作为参数传递给ENTRYPOINT

在一个容器里面,要有一个能在容器tty的前端执行的进程,来维持容器的运行

  • 命令

    • tail -f /var/log/nginx_access.log 日志会变化,但是一般不看,会占io 一般不这么做作
    • tail -f /etc/hosts 一般建议看不经常变化的文件
    • pid为1 容器运行的第一个命令
  • 或者运行服务

    • CMD [“nginx”,"-g",“daemon off;”]
    • Java
    • mysql
  • 脚本 ADD run_nginx.sh /usr/local/nginx/sbin/run_nginx.sh RUN chmod a+x /usr/local/nginx/sbin/run_nginx.sh CMD ["/usr/local/nginx/sbin/run_nginx.sh"] vim Dockerfile docker build -t rockylinux:9.3 -f dockerfile.txt .

-t 是制作出来镜像的名字

#指定文件构建镜像
docker bulid -f 文件名

1. 常用选项说明
--build-arg,设置构建时的变量
--no-cache,默认false。设置该选项,将不使用Build Cache构建镜像
--pull,默认false。设置该选项,总是尝试pull镜像的最新版本
--compress,默认false。设置该选项,将使用gzip压缩构建的上下文
--disable-content-trust,默认true。设置该选项,将对镜像进行验证
--file, -f,Dockerfile的完整路径,默认值为‘PATH/Dockerfile’
--isolation,默认--isolation="default",即Linux命名空间;其他还有process或hyperv
--label,为生成的镜像设置metadata
--squash,默认false。设置该选项,将新构建出的多个层压缩为一个新层,但是将无法在多个镜像之间共享新层;设置该选项,实际上是创建了新image,同时保留原有image。
--tag, -t,镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag
--network,默认default。设置该选项,Set the networking mode for the RUN instructions during build
--quiet, -q ,默认false。设置该选项,Suppress the build output and print image ID on success
--force-rm,默认false。设置该选项,总是删除掉中间环节的容器
--rm,默认--rm=true,即整个构建过程成功后删除中间环节的容器
#一般写在第一行,使用的父镜像
FROM rockylinux:9.3

#标签,可以自定义信息,,MAINTAINER #作者是谁,已经弃用
LABEL MAINTAINER="xifds 1234449@163.com" build-time='2024-7-19' project='nginx'

#构建镜像时运行的命令(不能交互 记得加y)
###RUN yum install -y epel-release
RUN yum install -y nginx

#COPY source dest	(源 目标)
COPY ./nginx.repo /etc/yum.repos.d/
#拷贝文件到镜像里面,但是支持网络资源url,如果拷贝tar包可以自动将tar包资源拷贝进去,但是不能同时去用
ADD source dest	 

#工作目录
WORKDIR

#设置环境变量
ENV key value

#可以映射的端口
EXPOSE 9 443

#声明一个数据目录或者是配置目录(容器的目录)
VOLUME ["/usr/share/nginx/html"]

#docker run 时执行的第一条命令,会在原有的命令后面增加命令
ENTRYPOINT ["executable"]
#docker run 时执行的第一条命令,会覆盖原有的启动命令
CMD ["nginx","-g","daemon off;"]

3. Dockerfile生产#

1.基于alpine基础镜像制作自定义镜像#

  1. 换源
  2. 装包
mkdir -p /opt/dockerfile/system/alpine
cd /opt/dockerfile/system/alpine
vim build-command.sh 
#!/bin.bash
docker build -t harbor.123asd.com/docker/apline-nginx:v1.28.0 .

#判断
docker push harbor.123asd.com/docker/apline-nginx:v1.28.0
docker pull alpine:v3.22
docker run -it --rm alpine:3.22 sh

sed -i 's#https\?://dl-cdn.alpinelinux.org/alpine#https://mirrors.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories

docker cp 4df758ed62a3:/etc/apk/repositories /opt/dockerfile/system/alpine/

https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.22/ 一般都在这两目录 community->x86_64 main->x86_64

wget https://nginx.org/download/nginx-1.28.0.tar.gz
docker run -it --rm alpine:3.22 sh

docker cp id:/apps/nginx/conf/nginx.conf .

vim nginx.conf
user nginx;
daemon off;
location / {
  root /apps/nginx/html;
}

mkdir static
cd static/
vim static/index.html
ceshi alpine-text:v1
tar cvzf ../static.tar.gz index.html 
vim Dockerfile
FROM alpine:3.22
LABEL maintainer="123456@qq.com"

RUN sed -i 's#https\?://dl-cdn.alpinelinux.org/alpine#https://mirrors.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories
#安装编译环境
RUN apk update && apk 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 openssl openssl-dev vim

ADD nginx-1.28.0.tar.gz /opt
RUN cd /opt/nginx-1.28.0 && ./configure --prefix=/apps/nginx && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/bin/ &&rm -rf /opt/nginx-1.28.0

RUN addgroup -g 2021 -S nginx && adduser -G nginx -s /sbin/nologin -S -D -u 2021 nginx

COPY nginx.conf /apps/nginx/conf/nginx.conf
ADD static.tar.gz /data/nginx/html
RUN chown -R nginx:nginx /data/nginx /apps/nginx/

EXPOSE 80 443

CMD ["nginx"]

测试

docker run -itd --rm -p 80:80 harbor.123asd.com/docker/alpine-nginx:v1.28.0 

http://192.168.1.30/

腾讯元宝 - 轻松工作 多点生活

2.基于Ubuntu基础镜像制作自定义镜像#

mkdir -p /opt/dockerfile/system/ubuntu/ubuntu:22.04
cd /opt/dockerfile/system/ubuntu/ubuntu:22.04
vim build-command.sh 
#!/bin.bash
docker build -t harbor.123asd.com/docker/ubuntu-nginx:v1.28.0 .

判断
docker push harbor.123asd.com/docker/ubuntu#-nginx:v1.28.0
docker pull ubuntu:22.04
cp /opt/dockerfile/system/alpine/nginx-1.28.0.tar.gz .
cp /opt/dockerfile/system/alpine/static.tar.gz .
cp /opt/dockerfile/system/alpine//nginx.conf .

docker run -it --rm -p 8801:80 ubuntu:22.04 bash

cat > /etc/apt/sources.list << EOF
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
EOF

apt update
apt install -y ca-certificates
docker cp 5375e20cdbfb:/etc/apt/sources.list .
mv sources.list sources.list.http



cat > /etc/apt/sources.list << EOF
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
EOF


apt update
docker cp 5375e20cdbfb:/etc/apt/sources.list .
mv sources.list sources.list.https
vim Dockerfile
FROM ubuntu:22.04
LABEL maintainer="123456@qq.com"

ADD sources.list.http /etc/apt/sources.list
RUN apt update && apt install -y ca-certificates
ADD sources.list.https /etc/apt/sources.list
#安装编译环境
RUN apt update && apt install -y iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server iotop unzip zip make && touch /tmp/linux.txt

ADD nginx-1.28.0.tar.gz /usr/local/src
RUN cd /usr/local/src/nginx-1.28.0 && ./configure --prefix=/apps/nginx && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/bin/ &&rm -rf /usr/local/src/nginx-1.28.0

RUN groupadd -g 2021 nginx && useradd -g nginx -s /usr/sbin/nologin -u 2021 nginx

ADD nginx.conf /apps/nginx/conf/nginx.conf
ADD static.tar.gz /data/nginx/html
RUN chown -R nginx.nginx /data/nginx /apps/nginx/

EXPOSE 80 443

CMD ["nginx"]

测试

docker rmi -f `docker images |grep none |awk '{print $3}'`

docker run -it --rm -p 80:80 harbor.123asd.com/docker/ubuntu-nginx:v1.28.0 bash

docker run -itd -p 80:80 harbor.123asd.com/docker/ubuntu-nginx:v1.28.0 

3. 制作nginx镜像#

  • 注意权限
  • 编译使用默认是root用户
  • -p 容器里面的用户是nginx 宿主机的端口最好大于1024(没测出来,有时候87不可以)

vim build-command.sh #!/bin/bash TAG=$1 7.8.2003 docker build -t harbor.123asd.com/docker/centos:${TAG} .

bash build-command.sh 2024-01-01_10-10-45

编写Dockerfile:

vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

nginx需要修改的配置

docker cp ddf344ac3b95:/apps/nginx/conf/nginx.conf .
修改下面的配置
vim nginx.conf
user  nginx;
worker_processes  auto;
#daemon off;
server{
    location / {
        root /apps/nginx/html;
    }
}
vim build-command.sh
#!/bin/bash
TAG=1.28.0
docker build -t harbor.123asd.com/docker/nginx-web:${TAG} .

编写all-in-one Dockerfile

vim ./Dockerfile
#除了注释之外的第一行,必须是From xxx(xxx是基础镜像)
#base image for docker111 
From centos:7.8.2003
#镜像维护者信息
LABEL maintainer="123456@qq.com"

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 clean all  &&\
rm -rf /var/cache/yum

RUN yum install -y \
vim wget tree lrzsz \
gcc gcc-c++ autoconf automake \
pcre pcre-devel \
zlib zlib-devel \
openssl openssl-devel \
iproute net-tools iotop

ADD nginx-1.28.0.tar.gz /usr/local/src/
#ADD https://nginx.org/download/nginx-1.28.0.tar.gz /usr/local/src/
#RUN tar -xf /usr/local/src/nginx-1.28.0.tar.gz -C /usr/local/src/
#打开监控模块并编译,正常nginx的参数都应该加上,这里演示
RUN cd /usr/local/src/nginx-1.28.0 && ./configure --prefix=/apps/nginx --with-http_sub_module --with-http_ssl_module && make &&make install
#先创建nginx用户再编译安装,但编译过程会生成root属主文件
RUN useradd nginx -s /sbin/nologin
RUN chown -R nginx:nginx /apps/nginx \
    && chmod -R 755 /apps/nginx \
    && touch /apps/nginx/logs/access.log \
    && touch /apps/nginx/logs/error.log \
    && chown nginx:nginx /apps/nginx/logs/*.log

#ADD有重新命明的作用,容器里面没有目录他会自己创建
ADD nginx.conf /apps/nginx/conf/nginx.conf
# ADD code.tar.gz /usr/local/nginx/html
RUN ln -sv /apps/nginx/sbin/nginx /usr/sbin/nginx
RUN echo "test nginx page" > /apps/nginx/html/index.html
#向外开放的端口,多个端口用空格做间隔,启动容器的时候-p需要使用此端向外映射,如 -p 8081:80,则80就是这里的80
EXPOSE 80 443 
#运行命令,每个Dockerfile只能有一条,如果有多条则只有最后一条被执行
CMD ["nginx","-g","daemon off;"]

#其他方法,写脚本,把配置写进nginx的配置文件
#脚本名字一般叫run_nginx.sh
#ADD run_nginx.sh /usr/local/nginx/sbin/run_nginx.sh
#RUN chmod a+x /usr/local/nginx/sbin/run_nginx.sh
#CMD ["/usr/local/nginx/sbin/run_nginx.sh"]
#脚本的好处可以进行一些简单操作
docker build -t harbor.123asd.com/docker/nginx-web:1.28.0 .
docker run -itd --rm -p 87:80 harbor.123asd.com/docker/nginx-web:1.28.0 
curl 192.168.1.30:87

4.分层构建tomcat镜像#

基础镜像->jdk镜像->Tomcat镜像-业务镜像

1. 制作centos7.8:base#

mkdir -p /opt/dockerfile/system/centos/centos:7.8.2003
cd /opt/dockerfile/system/centos/centos:7.8.2003

写base镜像构建脚本

cat  > build-command.sh << 'EOF'
#!/bin/bash
#TAG=\$1
TAG=7.8.2003
docker build -t harbor.123asd.com/docker/centos-base:${TAG} . 
EOF

打base镜像

vim Dockerfile
FROM centos:7.8.2003
LABEL maintainer="name 123456@163.com"
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 clean all  &&\
rm -rf /var/cache/yum

RUN yum install -y \
vim wget tree lrzsz \
gcc gcc-c++ autoconf automake \
pcre pcre-devel \
zlib zlib-devel \
openssl openssl-devel \
iproute net-tools iotop
#添加系统账户(如果项目都是通过同一个用户启动的,可以在这里添加系统用户)
RUN groupadd www -g 2022 && useradd www -u 2022 -g www

#容器的时区,和宿主机可能不一样
RUN rm -rf /etc/localtime && \
ln -snf /usr/share/zoneinfo/Aisa/Shanghai /etc/localtime 

测试

bash build-command.sh

2. 制作jdk-24.0.1#

cd /opt/dockerfile/web/jdk
mkdir jdk-24.0.1
cd /opt/dockerfile/web/jdk/jdk-24.0.1
wget https://download.oracle.com/java/24/latest/jdk-24_linux-x64_bin.tar.gz

写jdk环境变量

docker run -itd --rm harbor.123asd.com/docker/centos-base:7.8.2003
docker cp 2fdcf6b3c8ba:/etc/profile /opt/dockerfile/web/jdk/jdk-24.0.1/
docker rm -f 2fdcf6b3c8ba

#末尾添加
vim profile
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar


export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

写jdk的构建shell

cat > build-command.sh << 'EOF' 
#!/bin/bash 
#TAG=$1
TAG=24.0.1
docker build -t harbor.123asd.com/docker/centos-jdk-base:${TAG} .
EOF

编写jdk的Dockerfile

vim Dockerfile
FROM harbor.123asd.com/docker/centos-base:7.8.2003
LABEL maintainer="name 12346@163.com"
ADD jdk-24_linux-x64_bin.tar.gz /usr/local/src
RUN ln -sv /usr/local/src/jdk-24.0.1 /usr/local/jdk
ADD profile /etc/profile
#容器启动的时候,root账号是不会读取/etc/profile的

#root用户启动容器不会读取/etc/profile,给root用户设置环境变量
ENV JAVA_HOME /usr/local/jdk
ENV JRE_HOME JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib
ENV PATH $PATH:$JAVA_HOME/bin

测试jdk

tar xvzf dockerfile-jdk-24.0.1.tar.gz
cd jdk-24.0.1/
bash build-command.sh
docker run -it --rm harbor.123asd.com/docker/centos-jdk-base:24.0.1 bash

3. 制作tomcat-v10.0.2#

cd /opt/dockerfile/web/tomcat
mkdir tomcat-v10.0.2
cd tomacat-v10.0.2
wget https://archive.apache.org/dist/tomcat/tomcat-10/v10.0.2/bin/apache-tomcat-10.0.2.tar.gz

写tomcat环境变量

docker run -itd --rm harbor.123asd.com/docker/centos-jdk-base:24.0.1
docker cp 7713a5fe1233:/etc/profile /opt/dockerfile/web/tomcat/tomcat-v10.0.2
docker rm -f 7713a5fe1233

#末尾添加
vim profile
export JAVA_HOME=/usr/local/jdk
export TOMCAT_HOME=/apps/tomcat
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$TOMCAT_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

写Tomcat的构建脚本

vim build-command.sh
#!/bin/bash 
#TAG=$1
TAG=v10.0.2
docker build -t harbor.123asd.com/docker/tomcat-centos-base:${TAG} .

写Tomcat的Dockerfile

vim Dockerfile
#tomcat base image
FROM harbor.123asd.com/docker/centos-jdk-base:24.0.1
LABEL maintainer="123 123@qq.com"
#VOLUME /data /apps #通常做挂载点,但是自己添加有小bug
ADD apache-tomcat-10.0.2.tar.gz /apps
RUN ln -sv /apps/apache-tomcat-10.0.2 /apps/tomcat
ADD profile /etc/profile
#测试 
#这个镜像不用启动,在后面的业务中填写相关代码,但是测试需要手动测试
bash build-command.sh
docker run -it -p 8080:8080 harbor.123asd.com/docker/tomcat-centos-base:v10.0.2 bash
chown -R www.www /apps/ 
su - www -c "/apps/tomcat/bin/catalina.sh start" 
ss -tlnp

4. 制作业务镜像app1#

业务镜像

cd /opt/dockerfile/web/tomcat
mkdir tomcat-app1
cd tomcat-app1
#拿配置文件
docker run -it --rm harbor.123asd.com/docker/tomcat-centos-base:v10.0.2 bash
vim /apps/tomcat/conf/server.xml
<Host name="localhost" appBase="/data/tomcat/webapps" unpack="false" autoDeploy="false">
docker cp a024a2919843:/apps/tomcat/conf/server.xml .

写一个普通用户启动tomcat的脚本

cat > run_tomcat.sh << 'EOF'
#!/bin/bash
source /etc/profile
chown -R www.www /apps/
su - www -c "/apps/tomcat/bin/catalina.sh start"
tail -f /etc/hosts
EOF
chmod a+x run_tomcat.sh

写一个build脚本`

vim build-command.sh
#!/bin/bash 
#TAG=$1
TAG=v1
docker build -t harbor.123asd.com/docker/tomcat-app:${TAG} .

写一个java测试页面

mkdir myapp
vim myapp/index.jsp
tomcar-text-app1
tar czvf myapp.tar.gz myapp/
vim Dockerfile
#app1 shangxian
FROM harbor.123asd.com/docker/tomcat-centos-base:v10.0.2
LABEL maintainer="aaa 123@qq.com"

ADD server.xml /apps/tomcat/conf/server.xml
ADD run_tomcat.sh /apps/tomcat/bin/run_tomcat.sh
ADD myapp.tar.gz /data/tomcat/webapps/

RUN chown www.www /data /apps -R
EXPOSE 8080 8443

CMD ["/apps/tomcat/bin/run_tomcat.sh"]

测试

###注意这里不能写bash,会覆盖CMD的命令
ll 检查配置文件权限
bash build-command.sh
docker run -itd --rm -p 8080:8080 harbor.123asd.com/docker/tomcat-app:v1
192.168.1.30:8080/myapp/

后期来新业务

cp -r tomcat-app1 tomcat-app2
cd tomcat-app2

tar -xvf myapp.tar.gz
vim myapp/index.jsp
tomcat-text-app2

mv myapp.tar.gz /tmp/
tar cvzf myapp.tar.gz myapp/

vim build-command.sh
#!/bin/bash 
#TAG=$1
TAG=v2
docker build -t harbor.123asd.com/docker/tomcat-app:${TAG} .

bash build-command.sh
docker run -itd --rm -p 8080:8080 harbor.123asd.com/docker/tomcat-app:v2
192.168.1.30:8080/myapp/

5.docker结合负载均衡实现网站高可用#

192.168.1.31
docker pull harbor.123asd.com/docker/tomcat-app:v1
docker run -itd --name web1 -p 8080:8080 harbor.123asd.com/docker/tomcat-app:v1

192.168.1.32
docker pull harbor.123asd.com/docker/tomcat-app:v2
docker run -itd --name web2 -p 8080:8080 harbor.123asd.com/docker/tomcat-app:v2

192.168.1.30
cp -r /opt/dockerfile/web/nginx/nginx-1.28.0 /opt/dockerfile/web/nginx/nginx-1.28.0-v2
cd /opt/dockerfile/web/nginx/nginx-1.28.0-v2

vim nginx.conf
http{
  upstream web {
    server 192.168.1.31:8080;
    server 192.168.1.32:8080;
    }
  server {
    location /myapp {
          proxy_pass http://web;
        }
  }
}



vim build-command.sh 改成v2
bash build-command.sh 

docker run -itd -p 8801:80 harbor.123asd.com/docker/nginx:v2

192.168.1.30
192.168.1.30:8801/myapp

haproxy

192.168.1.30
cd /opt/dockerfile/web/haproxy

mkdir -p /data/haproxy/conf/
cp /opt/dockerfile/web/haproxy/haproxy-2.2.11/haproxy.cfg /data/haproxy/conf/
vim /data/haproxy/conf/haproxy.cfg
server web1 192.168.1.30:8801 check inter 3000 fall 2 rise 5

测试
docker run -it --rm -p 80:80 -v /data/haproxy/conf/haproxy.cfg:/etc/haproxy/haproxy.cfg harbor.123asd.com/docker/haproxy:v2.2.11 
正式
docker run -itd -p 80:80 -v /data/haproxy/conf/haproxy.cfg:/etc/haproxy/haproxy.cfg harbor.123asd.com/docker/haproxy:v2.2.11 

验证
iptables -t nat -vnL
192.168.1.30
192.168.1.30/myapp 刷新查看轮询

5. haproxy镜像构建#

https://www.haproxy.org/download/2.2/src/haproxy-2.2.11.tar.gz

mkdir -p /opt/dockerfile/web/haproxy/haproxy-2.2.11
cd /opt/dockerfile/web/haproxy/haproxy-2.2.11

编写编译脚本

vim build-command.sh
#!/bin/bash 
#TAG=$1
TAG=v2.2.11
docker build -t harbor.123asd.com/docker/haproxy:${TAG} .

编写配置文件

vim haproxy.cfg
global
chroot /apps/haproxy
#stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin
uid 99
gid 99
daemon
nbproc 1
pidfile /apps/haproxy/run/haproxy.pid
log 127.0.0.1 local3 info

defaults
option http-keep-alive
option forwardfor
mode http
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms

listen stats
mode http
bind 0.0.0.0:9999
stats enable
log global
stats uri /haproxy-status
stats auth haadmin:123456

listen web_port
bind 0.0.0.0:80
mode http
log global
balance roundrobin
server web1 192.168.1.31:8080 check inter 3000 fall 2 rise 5
server web2 192.168.1.32:8080 check inter 3000 fall 2 rise 5

编写运行脚本

vim run_haproxy.sh
#!/bin/bash
/apps/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg
tail -f /etc/hosts
chmod a+x run_haproxy.sh

编写dockerfile

vim Dockerfile
#haproxy image
FROM harbor.123asd.com/docker/centos-base:7.8.2003
LABEL maintainer="aaa 123@qq.com"
RUN yum install -y libtermcap-devel ncurses-devel libevent-devel readline-devel gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate

ADD haproxy-2.2.11.tar.gz /usr/local/src/
RUN cd /usr/local/src/haproxy-2.2.11 && make ARCH=X86_64 TARGET=Linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1  PREFIX=/apps/haproxy && make install PREFIX=/apps/haproxy && cp haproxy /usr/sbin/ && mkdir -p /apps/haproxy/run
ADD run_haproxy.sh /apps/haproxy/bin/run_haproxy.sh
ADD haproxy.cfg /etc/haproxy/haproxy.cfg
EXPOSE 80 9999
CMD ["/apps/haproxy/bin/run_haproxy.sh"]
编译安装haproxy使用lua添加的参数
USE_LUA=1 LUA_INC=/usr/local/src/lua-5.3.5/src/ LUA_LIB=/usr/local/src/lua-5.3.5/src/

测试

#中途测试
docker run -itd --rm -p 8800:80 -p 9999:9999 harbor.123asd.com/docker/haproxy:v2.2.11 
/apps/haproxy/sbin/haproxy -v

#最终测试
docker exec -it id bash
ps -ef | grep haproxy
ss -tlnp

192.168.1.30:9999/haproxy-status
haadmin
123456


192.168.1.30:8800 刷新

6. 构建wordpress#

#这里是思路,正确的在下面
#
#
#
FROM rockylinux:9.3

LABEL MAINTAINER="guo guo@163.com" project="wordpress"


#RUN  yum install -y http://rpms.remirepo.net/enterprise/remi-release-9.rpm
#Remi repository是包含最新版本PHP和MySQL包的Linux源,由Remi提供维护。
RUN yum -y install https://mirrors.aliyun.com/remi/enterprise/remi-release-9.rpm
RUN yum -y install php80-php-xsl php80-php php80-php-cli php80-php-devel php80-php-gd php80-php-pdo php80-php-mysql php80-php-fpm

#配置nginx源
RUN cat <<EOF > /etc/yum.repos.d
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF


#COPY ./default.conf /etc/nginx/conf.d



#查看php监听sock文件vim /etc/opt/remi/php80/php-fpm.d/www.conf
sed -i 's/^user = apache/user = apache,nginx/g' /etc/opt/remi/php80/php-fpm.d/www.conf

sed -i 's/^group = apache/group = apache,nginx/g' /etc/opt/remi/php80/php-fpm.d/www.conf



#配置php的nginx
RUN cat <<EOF > /etc/nginx/conf.d/default.conf
server {
        listen 80;
        server_name _;
        location / {
                root /usr/share/nginx/html;
                index index.php;
        }
        location ~ \.php$ {
                root /usr/share/nginx/html;
                fastcgi_pass unix:///var/opt/remi/php80/run/php-fpm/www.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}
EOF


ADD ./wordpress-6.6.1-zh_CN.tar.gz /usr/share/nginx/
RUN rm -rf /usr/share/nginx/html/* 
RUN tar -xf wordpress-6.6.1-zh_CN.tar.gz -C /usr/share/nginx/
RUN mv /usr/share/nginx/wordpress/* /usr/share/nginx/html
#COPY ./nginx.repo /etc/yum.repos.d

RUN yum install -y nginx
#RAN chmod 777 -R /usr/share/nginx/html
#RAN wget https://cn.wordpress.org/latest-zh_CN.zip 
#RAN unzip latest-zh_CN.zip  -d /usr/share/nginx


RUN cat <<EOF > /opt/docker-login.sh
nginx&/opt/remi/php80/root/usr/sbin/php-fpm
echo "nginx和php已经启动"
EOF

EXPOSE 80 443
#CMD ["sh","/opt/docker-login.sh"]

RUN chome +x /opt/docker-login.sh
CMD ["bash","/opt/docker-login.sh"]

vim /opt/docker-login.sh
	chmod 777 /var/opt/remi/php80/run/php-fpm/www.sock
	/opt/remi/php80/root/usr/sbin/php-fpm
	nginx -g "daemon off;"
	echo "nginx和php已经启动"


#docker run -itd -e MYSQL_ROOT_PASSWORD="123qweR" -e MYSQL_DATABASE="wordpress" -P mysql:8.0



#构建
docker build -t myword:v1.0
docker run -itd -P myword:v1.0 
docker exec -it $id /bin/bash

docker run -it myword:v1.2 /bin/bash
#启动php服务
>/opt/remi/php80/root/usr/sbin/php-fpm

#如果一个容器宕了可以创建一个新的容器
docker run -itd -P --name wordpress --link=$镜像名字 myword:v1.0

nginx的php配置项

server {
        listen 80;
        server_name _;
        location / {
                root /usr/share/nginx/html;
                index index.php;
        }
        location ~ \.php$ {
                root /usr/share/nginx/html;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastchi_script_name;
                include fastcgi_params;
        }
}



#########这次要用的
server {
        listen 80;
        server_name _;
        location / {
                root /usr/share/nginx/html;
                index index.php;
        }
        location ~ \.php$ {
                root /usr/share/nginx/html;
                fastcgi_pass unix:///var/opt/remi/php80/run/php-fpm/www.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastchi_script_name;
                include fastcgi_params;
        }
}
成功案例
FROM rockylinux:9.3
LABEL MAINTAINER="guo guo@163.com" project="wordpress"

RUN yum install -y http://rpms.remirepo.net/enterprise/remi-release-9.rpm
RUN yum -y install php80-php-xsl php80-php php80-php-cli php80-php-devel php80-php-gd php80-php-pdo php80-php-mysql php80-php-fpm 

RUN sed -i 's/^user = apache/user = nginx/g' /etc/opt/remi/php80/php-fpm.d/www.conf

RUN sed -i 's/^group = apache/group = nginx/g' /etc/opt/remi/php80/php-fpm.d/www.conf


RUN mkdir -p /etc/nginx/conf.d
RUN touch default.conf
RUN chmod 777 default.conf
RUN cat <<EOF > /etc/nginx/conf.d/default.conf
server {
        listen 80;
        server_name _;
        location / {
                root /usr/share/nginx/html;
                index index.php;
        }
        location ~ \.php$ {
                root /usr/share/nginx/html;
                fastcgi_pass unix:///var/opt/remi/php80/run/php-fpm/www.sock;                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
                include fastcgi_params;
        }
}
EOF

RUN yum -y install nginx
RUN rm -rf /usr/share/nginx/html/* 
COPY ./wordpress-6.6.1-zh_CN.tar.gz /usr/share/nginx/
RUN pwd
RUN tar -xf /usr/share/nginx/wordpress-6.6.1-zh_CN.tar.gz -C /usr/share/nginx/ 
RUN mv /usr/share/nginx/wordpress/* /usr/share/nginx/html/
RUN chmod 777 -R /usr/share/nginx/html

RUN cat <<EOF > /opt/docker-login.sh
/opt/remi/php80/root/usr/sbin/php-fpm
chmod 777 /var/opt/remi/php80/run/php-fpm/www.sock
nginx -g "daemon off;"
echo "nginx和php已经启动"
EOF

EXPOSE 80 443


RUN chmod +x /opt/docker-login.sh
CMD ["bash","/opt/docker-login.sh"]


curl -Ik 172.17.0.2
#k
http://192.168.10.71:32786

7.#

FROM daocloud.io/library/centos:7
LABEL MAINTARER=guo
RUN curl -o 
RUN yum install -y nginx
COPY /opt/web /usr/share/nginx/html
EXPOSE 80 443 #告诉inspest的端口信息,-P
VOLUME /usr/share/nginx/html #映射提示
ENV level=1.16.1
CMD ["sh","/docker-enterypoint.sh"]

8. python djangou项目#

pythondjango项目,需要构建并运行
1、git clone 项目
2、修改配置文件
redis 地址
mysql 地址和库 mysql.serve

docker run itd -e MYSQL_BOOT_PASSWORD="123QWE"