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
'''