文章目录

  • 一、手动制作docker镜像
  • 1.制作一个基于centos7系统的nginx镜像(单服务)
  • 2.制作nginx+ssh双服务的镜像
  • 3.制作一个基于centos6系统的kod网盘的镜像(多服务)
  • 二、自动制作docker镜像
  • 三、docker镜像的分层(复用,节省空间)
  • 四、dockerfile的优化
  • 五、容器间的互联
  • 六、单机版的容器编排


一、手动制作docker镜像

1.制作一个基于centos7系统的nginx镜像(单服务)

1:启动一个基础容器centos7
docker run -it -p 80:80 centos:7 /bin/bash

2:在容器中正常安装服务
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install nginx  -y
nginx (无法使用systemd来启动服务)
rm -fr /usr/share/nginx/html/index.html
echo 'oldboy' >/usr/share/nginx/html/index.html
exit

3:把安装好服务的容器提交为镜像
docker container commit 292453bd62f1 centos7_nginx:v1
 
4:测试
docker run -d -it -p 82:80 centos7_nginx:v1 nginx -g 'daemon off;'

2.制作nginx+ssh双服务的镜像

1:启动一个基础容器
docker run -it -p 80:80 -p 1022:22  centos7_nginx:v1 /bin/bash

2:在容器中正常安装服务
yum install openssh-server -y
yum install initscripts -y
/usr/sbin/sshd-keygen
/usr/sbin/sshd
echo '123456'|passwd --stdin root

vim  /init.sh
#!/bin/bash

nginx
/usr/sbin/sshd -D
服务
3:把安装好的容器提交为镜像
docker commit bb16eb415b3e centos7_nginx_ssh:v1

4:测试
docker run -d -p 82:80 -p 1024:22 centos7_nginx_ssh:v1 /bin/bash /init.sh
[root@docker01 ~]# curl 10.0.0.11:82
oldboy
[root@docker01 ~]# ssh root@10.0.0.11 -p1024

3.制作一个基于centos6系统的kod网盘的镜像(多服务)

kod的应用环境
nginx 1.16+php 5.4

centos 7容器
yum install nginx php-fpm php-mbstring.x86_64 php-gd -y

centos_nginx容器
yum install  php-fpm php-mbstring.x86_64 php-gd -y


1:启动一个centos7_nginx:v1,再安装php
yum install php-fpm php-gd php-mbstring -y
vi /etc/php-fpm.d/www.conf
php-fpm -D
grep -Ev '^$|#' /etc/nginx/nginx.conf.default 
grep -Ev '^$|#' /etc/nginx/nginx.conf.default >/etc/nginx/nginx.conf
 vi /etc/nginx/nginx.conf
 nginx -t
 nginx
mkdir /html
cd /html
yum install unzip -y
unzip kodexplorer4.40.zip 
chown -R nginx:nginx .

vi /init.sh
#!/bin/bash

php-fpm -D
nginx -g 'daemon off;'

2:把安装好服务的容器,提交为镜像
docker commit 47208e3e3796 kod:v2
3:测试镜像的功能
docker run -d -p 83:80 kod:v2 /bin/bash /init.sh

二、自动制作docker镜像

镜像: 中药

dockerfile: 配方

dockerfile常用指令

FROM  基础镜像
RUN   制作镜像过程中需要的执行命令(安装服务)
CMD   容器启动的时候执行的初始命令,容易被替换(启动服务)
ENTRYPOINT  容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
ADD   把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包)
COPY  把dockerfile当前目录下的文件拷贝到容器中(不解压tar包)
WORKDIR 指定容器的默认工作目录(类似cd)
EXPOSE  镜像要暴露的端口(docker run -P大写)
VOLUME  持久化卷(自动创建随机名字的卷)
ENV     环境变量(ssh的密码,数据库的密码)
LABEL       镜像的属性标签
MAINTAINER  管理者标识

根据dockerfile自动构建镜像的思路

a:手动制作docker镜像,记录历史命令
b:根据历史命令编写dockerfile文件
c:docker build构建docker镜像
d:测试镜像的功能

dockerfile单服务例子1 nginx:

[root@docker01 centos7_nginx]# vim dockerfile 
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx  -y
RUN rm -fr /usr/share/nginx/html/index.html
RUN echo 'oldboy' >/usr/share/nginx/html/index.html

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

提交镜像
docker  build -t centos7_nginx:v1  .

验证:
docker run -d -p 80:80 centos7_nginx:v1

dockerfile使用环境变量的例子:

FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install nginx openssh-server initscripts -y
RUN /usr/sbin/sshd-keygen
ADD init.sh  /init.sh
ENTRYPOINT ["/bin/bash","/init.sh"]

vi  init.sh
#!/bin/bash
if [ -z $SSH_PWD ];then
    SSH_PWD=$1
fi

echo $SSH_PWD|passwd --stdin root
nginx
/usr/sbin/sshd -D

自动制作kod可道云镜像

编辑dockerfile文件
[root@docker01 kod]# vim dockerfile 
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo && \
yum install unzip nginx php-fpm php-gd php-mbstring -y && \
yum clean all && yum makecache
ADD www.conf /etc/php-fpm.d/www.conf
ADD nginx.conf /etc/nginx/nginx.conf
RUN mkdir /html
WORKDIR /html
COPY kodexplorer4.40.zip .
RUN unzip kodexplorer4.40.zip
RUN chown -R nginx:nginx .
COPY init.sh /
RUN chmod a+x /init.sh

CMD ["sh","-c","/init.sh"]

在kod目录下准备相应的文件,在手动制作的容器中获取相应文件
docker cp 1415ccb2f1ca:/etc/php-fpm.d/www.conf .
docker cp 1415ccb2f1ca:/etc/nginx/nginx.conf .
将kodexplorer4.40.zip上传

提交镜像
docker  build -t centos7_nginx_kod:v1  .

验证启动容器
docker run -d -p 80:80 centos7_nginx——kod:v1

三、docker镜像的分层(复用,节省空间)

docker 容器转镜像 docker容器镜像制作_docker 容器转镜像

四、dockerfile的优化

a: 使用体积小的linux镜像alpine(镜像小,上传快,下载快 )
b:尽可能的清理无用的缓存文件(尽可能把多个RUN合并)
c:修改dockerfile的时候,尽可能把修改的内容放在最后
d:使用.dockerignore忽略构建docker镜像时,不需要的文件

五、容器间的互联

docker run --link 正在运行容器的名字(单方向)

启动zabbix容器 旧版本命令
docker run --name mysql-server -it \
      -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 run --name zabbix-java-gateway -t \
      -d zabbix/zabbix-java-gateway:latest
    
docker run --name zabbix-server-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
      --link mysql-server:mysql \
      --link zabbix-java-gateway:zabbix-java-gateway \
      -p 10051:10051 \
      -d zabbix/zabbix-server-mysql:latest
      
docker run --name zabbix-web-nginx-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      --link mysql-server:mysql \
      --link zabbix-server-mysql:zabbix-server \
      -p 80:80 \
      -d zabbix/zabbix-web-nginx-mysql:latest
启动zabbix容器 新版本命令(官网有坑,已改)
docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net

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" \
      --network=zabbix-net \
      --restart unless-stopped \
      -d mysql:8.0 \
      --character-set-server=utf8 --collation-server=utf8_bin \
      --default-authentication-plugin=mysql_native_password

docker run --name zabbix-java-gateway -t \
      --network=zabbix-net \
      --restart unless-stopped \
      -d zabbix/zabbix-java-gateway:alpine-5.0-latest

docker run --name zabbix-server-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
      --network=zabbix-net \
      -p 10051:10051 \
      --restart unless-stopped \
      -d zabbix/zabbix-server-mysql:alpine-5.0-latest

docker run --name zabbix-web-nginx-mysql -t \
      -e ZBX_SERVER_HOST="zabbix-server-mysql" \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      --network=zabbix-net \
      -p 80:8080 \
      --restart unless-stopped \
      -d zabbix/zabbix-web-nginx-mysql:alpine-5.0-latest

六、单机版的容器编排

yum install docker-compose -y(需要epel源 curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo)

容器编排,批量管理一组容器的方法
单机 ssh 安装服务
集群 批量 安装服务 ansible yaml

docker-compose.yaml 描述docker如何启动一组容器

docker-compose up -d 创建并启动
docker-compose start 全部启动
docker-compose stop 全部停止
docker-compose restart
docker-compose down 停止并删除 卸载
docker-compose scale zabbix-java-gateway=3

[root@docker01 dockerfile]# cd docker-compose/ 
[root@docker01 docker-compose]# ls
docker-compose.yaml  docker-compose.yml.bak 
[root@docker01 docker-compose]# vim docker-compose.yml
version: '3'

services:
   mysql-server:
     image: mysql:5.7
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: root_pwd
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
     command: --character-set-server=utf8 --collation-server=utf8_bin
     
   zabbix-java-gateway:
     image: zabbix/zabbix-java-gateway:latest
     restart: always
     
   zabbix-server:
     depends_on:
       - mysql-server
     image: zabbix/zabbix-server-mysql:latest
     restart: always
     environment:
       DB_SERVER_HOST: mysql-server
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
       MYSQL_ROOT_PASSWORD: root_pwd
       ZBX_JAVAGATEWAY: zabbix-java-gateway
     ports:
       - "10051:10051"
       
   zabbix-web-nginx-mysql:
     depends_on:
       - zabbix-server
     image: zabbix/zabbix-web-nginx-mysql:latest
     ports:
       - "80:80"
     restart: always
     environment:
       DB_SERVER_HOST: mysql-server
       MYSQL_DATABASE: zabbix
       MYSQL_USER: zabbix
       MYSQL_PASSWORD: zabbix_pwd
       MYSQL_ROOT_PASSWORD: root_pwd