Docker自动化构建镜像
Dockerfile介绍
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
镜像: 中药
dockerfile: 配方
dockerfile常用指令
Dockerfile语法
FROM # 指定基础镜像
RUN # 在基础镜像中执行命令
CMD # 容器启动时,执行的pid为1的进程命令
ENTRYPOINT # 容器启动时,执行的pid为1的进程命令 (当ENTRYPOINT存在时,如果执行的是一个脚本,那么将CMD中的命令看成是一个参数)
例: CMD mysql php
ENTRYPOINT sh start.sh
那么就会变成
sh start.sh mysql php
ADD # 将宿主机上的包和文件,传递到容器中(如果是压缩包,则自动解压)
COPY # 将宿主机上的包和文件,传递到容器中(如果是压缩包,则不解压)
WORKDIR # 指定工作目录
EXPOSE # 声明端口
VOLUME # 持久化卷,指定目录挂载点
ENV # 环境变量
LABEL # 镜像标签
MAINTAINER # 管理者标识(镜像的作者是谁)
查看docker容器日志
docker logs 容器ID
自动构建wordpress
# 1.提前准备
-rw-rw-rw- 1 root root 431 Sep 11 10:08 blog.conf
-rw-r--r-- 1 root root 248 Sep 11 10:08 Dockerfile
-rw-rw-rw- 1 root root 20895591 May 23 15:38 nginx_php.tgz
-rw-rw-rw- 1 root root 83 Sep 11 10:08 start.sh
-rw-rw-rw- 1 root root 11098483 Sep 11 10:08 wordpress-5.0.3-zh_CN.tar.gz
# 2.编写dockerfile
[root@docker02 wordpress]# vim Dockerfile
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
RUN sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo
RUN yum install -y mariadb-server
ADD nginx_php.tgz /opt
RUN yum localinstall -y /opt/*.rpm
RUN /usr/libexec/mariadb-prepare-db-dir %n
RUN rm -f /etc/nginx/conf.d/*
COPY blog.conf /etc/nginx/conf.d/
COPY start.sh /
RUN mkdir /code
ADD wordpress-5.0.3-zh_CN.tar.gz /code
EXPOSE 80/tcp 443/tcp
CMD ["/bin/sh","/start.sh"]
VOLUME /code/wordpress
# 3.构建镜像
[root@docker02 wordpress]# docker build -t wp:v1 .
# 4.运行容器
[root@docker02 wordpress]# docker run --name wordpress -p 80:80 -d wp:v1
## 查看日志
docker logs 容器ID
Dockerfile优化
1) 用完包,删除
2) 叠层,减少层数,将所有的RUN合并
3)yum缓存一定要清
## 优化后
[root@docker02 wordpress]# cat Dockerfile
FROM centos:7
ADD nginx_php.tgz /
COPY start.sh /
RUN rm -f /etc/yum.repos.d/* && \
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 && \
sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo && \
yum install -y mariadb-server && \
cd /nginx_php && \
yum localinstall -y *.rpm && \
/usr/libexec/mariadb-prepare-db-dir %n && \
mkdir /code && \
rm -f /etc/nginx/conf.d/* && \
rm -f /nginx_php/* && \
yum clean all && \
rm -f /etc/yum.repos.d/*
COPY blog.conf /etc/nginx/conf.d/blog.conf
ADD wordpress-5.0.3-zh_CN.tar.gz /code
EXPOSE 80 3306
VOLUME /code/wordpress
CMD ["/bin/sh","start.sh"]
使用docker运行MySQL
## 官方案例
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
## 常规启动
docker run --name mysql57 -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7
## 需要数据
docker run --name mysql57 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7
docker run \
--name mysql57 \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-e MYSQL_DATABASE='wordpress' \
-e MYSQL_USER='wp_user' \
-e MYSQL_PASSWORD='111' \
-p 3306:3306 \
-d mysql:5.7
容器通信
容器的单向通信
--link
[root@docker01 ~]# docker run --name wp -p 80:80 --link mysql57 -d wp:v1
使用docker启动zabbix5.0
# 1.启动zabbix数据库
docker run \
--name zabbix-db \
-v /data/zabbix:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-e MYSQL_DATABASE='zabbix' \
-e MYSQL_USER='zabbix' \
-e MYSQL_PASSWORD='123' \
-p 33060:3306 \
-d mysql:5.7 \
--character-set-server=utf8 \
--collation-server=utf8_bin
# 2.启动zabbix-server
docker run \
--name zabbix-server \
--link zabbix-db \
-e DB_SERVER_HOST="zabbix-db" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="123" \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:5.0.37-alpine
# 3.启动zabbix前端
docker run \
--link zabbix-db \
--link zabbix-server \
--name zabbix-web \
-e DB_SERVER_HOST="zabbix-db" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="123" \
-e ZBX_SERVER_HOST="zabbix-server" \
-e PHP_TZ="Asia/Shanghai" \
-p 8080:8080 \
-d zabbix/zabbix-web-nginx-mysql:5.0.37-alpine
使用docker启动zabbix6.4
# 0.安装mariadb客户端
yum install -y mariadb
# 1.启动zabbix数据库
docker run \
--name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="123" \
-e MYSQL_ROOT_PASSWORD="123" \
--restart unless-stopped \
-p 3306:3306 \
-d mysql:8.0-oracle \
--character-set-server=utf8 --collation-server=utf8_bin \
--default-authentication-plugin=mysql_native_password
# 2.启动zabbix-server
docker run \
--name zabbix-server-mysql \
--link mysql-server \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="123" \
-e MYSQL_ROOT_PASSWORD="123" \
-p 10051:10051 \
--restart unless-stopped \
-d zabbix/zabbix-server-mysql:alpine-6.4-latest
# 3.启动zabbix前端
docker run \
--link mysql-server \
--link zabbix-server-mysql \
--name zabbix-web-nginx-mysql \
-e ZBX_SERVER_HOST="zabbix-server-mysql" \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="123" \
-e MYSQL_ROOT_PASSWORD="123" \
-p 8080:8080 \
--restart unless-stopped \
-d zabbix/zabbix-web-nginx-mysql:alpine-6.4-latest
使用docker启动wordpress(传参版)
# 启动数据库
docker run \
--name mysql57 \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-e MYSQL_DATABASE='wordpress' \
-e MYSQL_USER='wp_user' \
-e MYSQL_PASSWORD='123' \
-p 3306:3306 \
-d mysql:5.7
# Dockerfile
[root@docker02 wordpress]# vim Dockerfile
FROM centos:7
ADD nginx_php.tgz /
WORKDIR /code
ADD wordpress-5.0.3-zh_CN.tar.gz /code
ENV DB_NAME=db \
DB_USER=user \
DB_PASSWORD=password \
DB_HOST=host
RUN cd /nginx_php && \
yum localinstall -y *.rpm && \
chown -R apache:apache /code && \
rm -f /etc/nginx/conf.d/* && \
rm -f /nginx_php/* && \
cp /code/wordpress/wp-config-sample.php /code/wordpress/wp-config.php && \
yum clean all
COPY blog.conf /etc/nginx/conf.d/blog.conf
COPY docker-entrypoint.sh /usr/local/bin/
EXPOSE 80
CMD ["/bin/sh","/usr/local/bin/docker-entrypoint.sh"]
# 启动脚本(传参版)
[root@docker02 wordpress]# vim docker-entrypoint.sh
#!/bin/bash
sed -i s#database_name_here#$DB_NAME#g /code/wordpress/wp-config.php
sed -i s#username_here#$DB_USER#g /code/wordpress/wp-config.php
sed -i s#password_here#$DB_PASSWORD#g /code/wordpress/wp-config.php
sed -i s#localhost#$DB_HOST#g /code/wordpress/wp-config.php
/sbin/nginx
/sbin/php-fpm
tail -f /etc/hosts
exec docker-entrypoint.sh "$@"
# 构建镜像
[root@docker02 wordpress]# docker build -t wp:v3 .
# 启动wordpress
docker run \
-p 80:80 \
--link mysql57 \
-e DB_NAME=wordpress \
-e DB_HOST=mysql57 \
-e DB_USER=wp_user \
-e DB_PASSWORD=123 \
-d wp:v3
指定渲染变量
软件名:gettext
命令:envsubst 可以识别环境变量
# 将变量导入文件并作为标准输出(源文件并不会改变)
envsubst <1.txt
# 再将标准输出导入到另一个文件
envsubst <1.txt >2.txt