dockerfile自动构建docker 镜像

# dockerfile 组成部分
1. 基础镜像信息   FROM centos:6.9
2. 制作镜像操作指令  RUN yum install openssh_server -y
3. 容器启动执行命令  CMD ["/bin/bash"]

# dockerfile 常用命令
docker logs 查看日志(容器夯不住)
docker stop 容器ID  # 停止容器
docker start 容器ID # 启动
1. FROM 指定基础镜像
2. MAINTAINER 指定维护者信息,可以没有
3. LABLE  描述,标签
4. RUN  所有的命令前面要加
5. ADD  会自动解压,添加脚本文件
6. WORKDIR  设置当前工作目录(在脚本中添加,每次进入容器后默认的目录)
7. VOLUME  设置卷,关在主机目录
8. EXPOSE  指定对外的端口 -p 随机端口
9. CMD  指定容器启动后要做的事情
############# 其他命令 ##################
1. COPY  复制文件,不会解压
2. ENV   环境变量
3. ENTRYPOINT 容器启动后执行的命令,无法被替换

# 排错
容器启动了,有的服务起了,有的没起?
# 手动进入容器调试脚本
docker run -it centos6.9_ssh_nginx:v4 /bin/bash
# 正在运行的容器, docker exec 进入排错
 
'''
VOLUMN /usr/share/nginx/html
    VOLUMN : 每启动一个容器,都会随机创建一个卷
    作用: 使用卷,可以将目录里的内容持久化,容器删了,卷还在,数据就在
EXPOSE 22 80
	EXPOSE: 做随机端口映射
ENTRYPOINT ["/bin/bash","init.sh"]
	ENTRYPOINT: 不允许覆盖初始启动命令(先用CMD,测试好了再用ENTRYPOINT)
用户自定义密码
    # echo "$SSH_PWD"|passwd --stdin root
    ENV SSH_PWD 123456  # 设置默认的环境变量
    启动命令要带参数: docker run -d -e "SSH_PWD = 123" -P centos6.9_ssh_nginx:v8
为docker容器添加一个健康检查机制
	HEALTHCHECK --interval=10s --timeout=3s --retries=3 CMD /bin/bash /opt/test.sh
'''
vi /opt/tesh.sh
#!/bin/bash
cat /var/run/nginx.pid
if [ $?==0 ];then
echo 0
exit 0
else
echo 1
exit 1
fi

例一:单个服务

手动构建一遍,然后写dockerfile 
# dockerfile 放在同一的目录下面
mkdir /opt/dockerfile
mkdir centos6.9_ssh
# 写dockerfile
vim dockerfile
FROM centos:6.9
RUN curl -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN yum install openssh-server -y
RUN service sshd restart
RUN echo '12345'|passwd --stdin root
CMD ["/usr/sbin/sshd","-D"]

# dockerfile 写完以后进行build
docker build -t centos6.9_ssh:v2 /opt/dockerfile/centos6.9_ssh
    
# 镜像创建成功,启动容器进行测试
docker run -d -p 1033:22 centos6.9_ssh:v2
        
'''
不同的RUN命令 可以用 && \ 连接起来一次性执行
'''

例二: 多个服务

vim dockerfile
FROM centos:6.9
RUN curl -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN yum install openssh-server nginx -y
RUN service sshd restart
RUN echo '12345'|passwd --stdin root
ADD init.sh /init.sh  # 将宿主机上的init文件拷贝到容器 /init.sh中 
CMD ["/usr/sbin","/init.sh"]

# build
docker build -t centos6.9_ssh_nginx:v4 
# 测试
docker run -d -p 2028:22 -p 85:80centos6.9_ssh_nginx:v4
docker ps -a -l
测试ssh 连接, ps -ef|nginx

通过dockerfile, 制作一个kodexplorer 网盘docker 镜像

# nginx + php -fpm (httpd + php)
# 先手动装一遍,然后写dockerfile 
1. 先启动基础容器
docker rm -f `docker ps -a -q`
docker run -it -p 80:80 centos:6.9
2. 改源
3. 装php ,会自动将apach 装好
yum install php -y
4. 起服务就可以放php代码
service httpd start  # 默认站点目录在 /var/www/html/
cd /var/www/html
rz -E kodexplorer4.40.zip
unzip kodexplorer4.40.zip
chown -R apache:apache .
yum install php-gd php-mbstring -y
service httpd restart
5. dockerfile 
FROM centos:6.9
RUN yum install php unzip php-gd php-mbstring -y
WORKDIR /var/www/html
# rz -E kodexplorer4.40.zip  这里从网上下载
ADD kodexplorer4.40.zip .
RUN unzip kodexplorer4.40.zip
RUN chown -R apache:apache .
ADD init.sh /init.sh
CMD ["/bin/bash","/init.sh"]

# dockerfile 写好以后build
docker build -t kod:v1 .
# 镜像启动容器
docker run -d -p 88:80 kod:v1

# 启动脚本
vim init.sh
#!/bin/bash
service httpd restart
tail -F /var/log/httpd/access_log
'''
还可以在dockerfile 中加健康检查
'''

docker 镜像分层

# 查看记录
docker image history centos6.9_ssh_nginx:v3
# 导出docker 镜像
docker save centos6.9_ssh_nginx:v3 > docker_centos6.9_ssh_nginx.tar.gz
# 将文件传输到另一台服务器
scp -rp docker_centos6.9_ssh_nginx.tar.gz 10.0.0.61:/root
# 导入镜像
docker load -i docker_centos6.9_ssh_nginx.tar.gz
# 分层原理
1. 和宿主机共用内核 Kernel
2. Debian or Centos etc.  # 一层镜像
3. openssh_server   # 两层镜像
4. nginx    # 三层镜像
-- 一个镜像至少有一层
-- centos 被多个镜像引用,只保存一份
-- 镜像从最底层开始导入,最终合并成
-- cd /var/lib/docker/image/overlay2/layerdb 
#!!! 因为通过parent找到父层,所以每次修改dockerfile 要放在最底下,尽量走cache 
分层好处: 复用,节省磁盘空间,相同的内容只加载一份到内存
          修改dockerfile后,重建速度快
实现: 通过特殊的文件系统实现 overlayFS

容器间的互联

# 容器间相互访问
# 进入容器,用ssh 连接另外一个容器
yum install openssh_clients  
docker run -it --link 容器名:web centos6.9_ssh_nginx
ping web  
# --link 在hosts 文件中自动加一行
-- ssh root@web
-- link 单向的,架构越后面的服务越先起,像数据库等

使用docker 运行zabbix-server

# 下载相关的包
for n in `ls *.tar.gz`;do docker load -i $n;done

docker run --name mysql-server -t \
	-e MYSQL_DATABASE="zabbix" \
    -e MYSQL_USER="zabbix" \
    -e MYSQL_PASSWORD="zabbix_pwd" \
    -e MYSQL_ROOT_PASSWORD="root_pwd" \
    -d mysql:5.7 \
    -- character-set-server=utf8 --collation-server=utf8_bin
....

docker 私有仓库

# registry.tar.gz  镜像
docker load -i registry.tar.gz 
# 启动容器 registry
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
# 上传镜像到私有仓库
1. 给镜像打标签
docker tag 镜像名 10.0.0.7:5000/镜像名zabbix/zabbix-server-mysql:latest        
2. 传到私有仓库
docker push 10.0.0.7:5000/镜像名zabbix/zabbix-server-mysql:latest    
# 上传成功以后就可以拉镜像了
docker run -d 10.0.0.7:5000/镜像名zabbix/zabbix-server-mysql:latest

# 镜像仓库加认证,带basic 认证的registry
docker rm -f `docker ps -a -q`
yum install httpd-tools -y
mkdir /opt/registry-var/auth/ -p
htpasswd -Bbn octivia 123 >> /opt/registry-var/auth/htpasswd
# 现在只能登录私有仓库才能上传镜像
docker login 10.0.0.7:5000
    
# 查看私有仓库有哪些镜像
10.0.0.7:5000/v2/_catalog
# 看某镜像有几个版本
10.0.0.7:5000/v2/镜像名/tags/list
# 删除私有仓库镜像(命令行不行)
手动进入registry 仓库中
docker exec -it 仓库ID /bin/sh
rm -rf /var/lib/registry/docker/registry/v2/repositories/zabbix/zabbix-java-gateway  # 只删除了镜像的索引
registry garbage-collect /etc/docker/registry/config.yml  # gc回收

'''
如果出现http错误,要改配置文件
resolve:
vim /etc/docker/daemon.json
{
"insecure-registries":["10.0.0.7:5000"]
}
systemctl restart docker

'''
posted on 2019-08-30 00:44  Afrafre  阅读(239)  评论(0编辑  收藏  举报