相关资料:
-
Docker入门教程 http://dockone.io/article/111
-
Docker_百度百科 http://baike.baidu.com/view/11854949.htm
-
史上最全Docker资料集粹 http://special.csdncms.csdn.net/BeDocker/
-
Docker - 话题精华 - 知乎 http://www.zhihu.com/topic/19950993/top-answers
-
docker 简明教程 | 简果网 http://www.simapple.com/docker-tutorial
-
如何使用Dockerfile构建镜像 http://blog.csdn.net/qinyushuang/article/details/43342553
-
Dockerfile reference - Docker https://docs.docker.com/engine/reference/builder/
-
dockers教程:https://yeasy.gitbooks.io/docker_practice/content/install/centos.html?q=
docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可以移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器时完全使用沙盒机制,相互之间不会有任何接口。几乎没有性能开销,省略掉了开机流程,可以很容易地在机器和数据中新运行
docker | 虚拟机 | |
相同点 | 1.都可在不同的主机之间迁移 2.都具备root权限 3.都可以远程控制 4. 都有备份、回滚操作 | |
操作系统 | 在性能上有优势,可以轻易的运行多个操作系统 | 可以安装任何系统,但是性能不及容器 |
原理 | 和宿主机共享内核,所以容器运行在容器引擎之上,容器并非一个完整的操作系统,所有容器共享操作系统,在进程级进行隔离 | 每一个虚拟机都建立在虚拟的硬件之上,提供指令级的虚拟,具备一个完整的操作系统 |
优点 | 高效、集中。一个硬件节点可以运行数以百计的容器,非常节省资源,Qos会尽量满足,但不保证一定满足。内核有提供者升级,服务由服务提供者管理 | 对操作系统具有绝对权限,对系统版本和系统升级具有完全的管理权限。具有一整套的资源:cpu、RAM和磁盘。Qos是有保证的,每一个虚拟机就像一个真实的物理机一样,可以实现不同的操作系统运行在同一个物理节点上 |
资源管理 | 弹性资源分配:资源可以在没有关闭容器的情况下添加,数据卷也无需重新分配大小 | 虚拟机需要重启,虚拟机里边的操作系统需要处理新加入的资源,如磁盘等,都需要重新分区。 |
远程管理 | 根据操作系统的不同,可以通过 shell 或者远程桌面进行 | 远程控制由虚拟化平台提供,可以在虚拟机启动之前连接 |
缺点 | 对内核没有控制权限,只有容器的提供者具备升级权限。只有一个内核运行在物理节点上,几乎不能实现不同的操作系统混合。容器提供者一般仅提供少数的几个操作系统 | 每一台虚拟机都具有更大的负载,耗费更多的资源,用户需要全权维护和管理。一台物理机上能够运行的虚拟机非常有限 |
配置 | 快速,基本上是一键配置 | 配置时间长 |
启动时间 | 秒级 | 分钟级 |
硬盘使用 | MB | GB |
性能 | 接近原生态 | 弱于原生态 |
系统支持数量 | 单机支持上千个 |
Docker系统架构
Docker使用客户端-服务端(C/S)架构模式,使用远程API来管理和创建Docker容器。
Docker容器通过Docker镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
说明 | |
镜像(images) | Docker 镜像是用于创建Docker 容器的模板 |
容器(Container) | 容器是独立运行的一个或一组应用 |
客户端(Client) | Docker客户端通过命令行或者其他工具使用Docker API 与 Docker 的守护进程通信。 |
主机(Host) | 一个物理或者虚拟的机器用于执行Docker 守护进程和容器 |
仓库(Registry) | Docker 仓库是用来保存镜像,可以理解为代码控制中的代码仓库。DockerHub提供了庞大的镜像集合供使用 |
DockerMachine |
环境规划:
主机名 | 内存 | ip |
docker01 | 2G | 10.0.0.11 |
docker02 | 2G |
修改ip地址、主机和hosts解析:
10.0.0.11 docker01 10.0.0.12 docker02
ip转发功能开启:
vim /etc/sysctl.conf net.ipv4.ip_forward=1 #重启network服务 systemctl restart network #查看是否修改成功 sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
安装docker
#安装docker-ce wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo yum install docker-ce -y systemctl enable docker systemctl start docker #验证 [root@docker01 yum.repos.d]# docker version Client: Docker Engine - Community Version: 19.03.5 API version: 1.40 Go version: go1.12.12 Git commit: 633a0ea Built: Wed Nov 13 07:25:41 2019 OS/Arch: linux/amd64 Experimental: false
离线下载
tar xf docker_rpm.tar.gz yum localinstall docker_rpm/*.rpm -y #验证 docker version .....此处省略
docker是一个cs架构, docker主要:镜像 容器 仓库 网络 存储 监控
docker是一个软件的打包技术.
# run等于创建容器和启动容器 docker run -d -p 80:80 nginx:latest run 创建并启动一个容器 -d 放后台启动 -p 端口映射 nginx:latest docker镜像名称
# 在官方仓库搜索nginx镜像
docker search nginx
2. docker pull 拉取镜像(下载镜像)
# 拉去官方镜像
docker image pull itsthenetework/nfs-server-alpine
3. docker push 推送镜像(上传镜像)
# 上传本地镜像alpine:v1到镜像仓库 docker push 10.0.0.11/library/alpine:latest
4. docker load 导入镜像
# 导入nginx镜像(推荐使用) docker load -i docker_nginx.tar.gz # 导入镜像没有镜像名称和版本 会多一个无名镜像 docker image import docker_alpine.tar.gz
5. docker save 导出镜像
# 将centos:7 的镜像打包成docker_centos7.tar.gz压缩包 导出镜像就不显示 docker save centos:7 -o docker_centos7.tar.gz
6. docker images 查看镜像列表
# 查看镜像列表 docker images (别名) 或者 docker image ls
7. docker rmi 删除镜像
#删除 alpine镜像
docker rmi alpine:latest
8. docker tag 给镜像打标签
# 给无名镜像贴标签
docker image tag <容器ID> alpine:latest
# 后台运行 docker run -d -it -p 80:80 nginx:latest run 创建并启动一个容器 -d 放后台启动 -p 端口映射 nginx:latest docker镜像名称
run参数
-i: 直接运行容器,通常与 -t 同时使用;
#使用命令/bin/bash直接前台进入centos:7 版本虚拟机 docker run -it -p 80:80 centos:7 /bin/bash
# 将容器暴露的所有端口,都随机映射到宿主机上 (不推荐) docker run -P -it alpine /bin/sh # 将容器指定端口随机映射到宿主机一个端口上 docker run -d -p :80 alpine_kod:v3
-p: 容器指定端口随机映射到宿主机指定端口
注:
# 指定容器80端口映射到宿主机80端口在后台运行 docker run -d -p 80:80 nginx:latest # 指定端口在前台运行 docker run -it -p 80:80 centos:6.9
2. docker create 创建容器 --name
#创建一个以alpine为镜像名字为nginx的容器 docker create <iso镜像版本> <容器名> docker create --name nginx nginx:latest 4ce0b66cb8492c7f8571a26d6bb14ae7ee593b01fd4c06e61b5a4c374af176f4
3. docker start 启动容器
# 启动未开启的容器 格式:docker <容器ID>
docker start <容器ID>
4. docker stop 停止容器
# 将创建的容器给停止 格式:docker stop <容器ID>或者<容器名>
docker stop nginx
docker stop 4ce0b66cb849
5. docker restart 重启容器
# 将创建的容器重启 格式:docker restart <容器ID>或<name>
docker restart nginx
docker restart 4ce0b66cb849
6. docker kill 强制停止容器
# 强制关闭nginx 格式:docker kill <容器ID>或<name> docker kill 4ce0b66cb849 docker kill nginx
7. docker ps 查看容器列表
-
-
-f 根据条件显示的内容
-
--format 指定返回值的模板文件
-
-l 显示最近创建的容器
-
-n 列出最近创建的n个容器
-
--no-trune 不截断输出
-
-q 静默模式,只显示容器编号
-
#列出所有容器 docker ps -a #列出最近创建的5个容器信息 docker ps -n 5 #列出所有创建的容器ID docker ps -a -q #列出最后一个容器 docker ps -l
输出详情介绍:
- IMAGE: 使用的镜像。
- COMMAND: 启动容器时运行的命令。
- CREATED: 容器的创建时间。
- STATUS:
状态有7种:
- restarting(重启中)
- running(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
#删除单个容器 docker rm <容器ID>或<容器名字> #删除所有已经停止的容器 docker rm $(docker ps -a -q)
#强制删除所有容器 docker rm -f `docker ps -a -q`
-v 删除与容器关联的卷
#删除容器nginx01,并删除容器挂载的数据卷 docker rm -v nginx01
-l 移除容器间的网络连接,而非容器本身
#移除容器nginx01对容器db01的连接,连接名db: docker rm -l db
9. docker exec 进入正在运行的容器(分配一个新终端)
#分配一个交互式的终端 docker exec -it <容器ID>或<容器名字> /bin/bash(/bin/sh)
10. docker attach 进入正在运行的容器(使用相同的终端)
#进入相同的终端
docker attach <容器ID>
容器想要放后台一直运行的话,那么容器的初始命令,必须夯住(前台运行),否则容器就会退出。
#前台运行 nginx -g 'daemon off;' /usr/sbin/php-fpm --nodaemonize
docker run -p 宿主机端口:容器端口 -p 宿主机ip1:宿主机端口:容器端口 (多个容器同时使用80端口) -p 宿主机ip1::容器端口 随机端口映射 -p 宿主机ip1::容器端口/udp 使用udp协议做随机端口映射 -p 80:80 -p 3306:3306 -p 1111-1119:1111-1119 端口范围映射 -P 自动随机端口映射
宿主机80端口映射到容器80端口
docker run -d -p 80:80 nginx:latest
多个ip地址映射到容器指定端口
#添加网卡 ifconfig eth0:1 10.0.0.10/24 up #指定网卡端口映射到容器端口 docker run -d -p 10.0.0.10:80:80 nginx:latest
多个ip地址端口随机映射到容器指定80端口
docker run -d -p 10.0.0.10::80 nginx:latest #查看端口映射 docker ps -a #指定udp协议--默认tcp协议 docker run -d -p 10.0.0.10::80/udp nginx:latest
多个端口进行映射
注:
#指定映射宿主机与容器的80,3306端口 docker run -d -p 80:80 -p 3306:3306 nginx:latest
指定端口范围进行映射
注:
#指定宿主机的90到99端口映射到容器100到109端口 docker run -d -p 90-99:100:109 nginx:latest
-P 随机指定端口
#随机映射端口 docker run -d -P nginx:latest docker ps -a 查看21 1
官方的解释是:数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS.
UFS即UNIX文件系统的简称
-
数据卷可以在容器之间共享和重用
-
对数据卷的修改会立马生效
-
对数据卷的更新,不会影响镜像
-
数据卷默认会一直存在,即使容器被删除
-
docker run -v 宿主机绝对目录:容器目录 -v 容器目录 #创建一个随机卷,来持久化容器的目录下的数据 -v 卷名:容器目录 #创建一个固定名字的卷,来持久化容器的目录下的数据 --volumes-from 跟某一个容器挂载所有的卷
1. 实现网页小鸟飞飞
#宿主机操作 创建目录并进入 mkdir /opt/xiaoniaofeifei cd /opt/xiaoniaofeifei unzip xiaoniaofeifei.zip #容器目录挂载容器目录 docker run -d -p 80:80 -v /opt/xiaoniaofeifei:/usr/share/nginx/html nginx:latest
mkdir /opt/xiaoniao cd /opt/xiaoniaofeifei --解压html文件 docker run -d -p 80-81:80-81 -v /opt/xiaoniao:/opt nginx:latest #进入容器进行创建 echo 'server { listen 81; server_name localhost; location / { root /opt; index index.html index.htm; } }' >/etc/nginx/conf.d/xiaoniao.conf #重启容器 docker restart 容器ID/容器名
#配置文件 echo 'server { listen 81; server_name localhost; location / { root /opt; index index.html index.htm; } }' >xiaoniao.conf docker run -d -p 84-85:80-81 -v /opt/xiaoniao:/opt nginx:latest #将配置文件复制到容器内 docker container cp xiaoniao.conf 34e0fbe5d88e:/etc/nginx/conf.d/xiaoniao.conf
docker run -d -p 90-91:80-81 -v /opt/xiaoniaofeifei:/opt -v /opt/xiaoniao.conf:/etc/nginx/conf.d/xiaoniao.conf nginx:latest --一步到位
echo '# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free # deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free # deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free deb http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free # deb-src http://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free deb http://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free # deb-src http://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free ' >/etc/apt/sources.list #更新源 apt-get update
2. 建随即卷,持久化数据
#创建一个随机卷 docker run -d -p 82:80 -v /usr/share/nginx/html nginx:latest #查看创建的卷--宿主机上的一个容器 docker volume ls DRIVER VOLUME NAME local 14f20e31f213497d336e06fa5b85702e2601d9755f6043c44cb6f9e384cfcc07 #查看卷的属性 docker volume inspect 14f20e31f213497d336e06fa5b85702e2601d9755f6043c44cb6f9e384cfcc07 [ { "CreatedAt": "2020-01-24T21:15:24+08:00", "Driver": "local", "Labels": null, "Mountpoint": # -- 宿主机上卷的位置 "/var/lib/docker/volumes/14f20e31f213497d336e06fa5b85702e2601d9755f6043c44cb6f9e384cfcc07/_data", "Name": "14f20e31f213497d336e06fa5b85702e2601d9755f6043c44cb6f9e384cfcc07", "Options": null, "Scope": "local" } ] [root@docker02 _data]# ls 50x.html index.html
#创建容器 挂载到有名字的数据卷 方式一:docker run -d -p 80:80 -v nginx:/usr/share/nginx/html nginx:latest 方式二:docker run -d -p 82:80 --volume nginx:/usr/share/nginx/html nginx:latest #查看卷 docker volume ls DRIVER VOLUME NAME local nginx
4. 挂载相同的目录
#挂载到之前容器相同目录 docker run -d -p 83:80 --volume-from 容器ID nginx:latest
1:启动一个纯净的centos:6.9容器,安装nginx docker run -it -p 80:80 centos:6.9 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo yum install nginx -y 2:把安装好服务的容器,提交为镜像 docker container commit 容器ID/容器名 centos6.9_nginx:v1 3:测试镜像的功能 docker run -d -p 82:80 centos6.9_nginx:v1 nginx -g 'daemon off;'
在线下载
wget http://static.kodcloud.com/update/download/kodexplorer4.40.zip unzip kodexplorer4.40.zip chown -R nginx:nginx .
安装可道云
1:启动一个centos6.9_nginx:v1,再安装php docker run -it -p 80:80 centos:6.9 /bin/bash yum install php-fpm php-gd php-mbstring -y vi /etc/php-fpm.d/www.conf --修改用户、组为nginx service php-fpm start cd /etc/nginx/conf.d/ vim default.conf # The default server server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /html; index index.php index.html; # Load configuration files for the default server block. #连接php include /etc/nginx/default.d/*.conf; location ~ .php$ { root /html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /html$fastcgi_script_name; include fastcgi_params; } } mkdir /html --解压kod文件到/html chown -R nginx:nginx . service nginx restart #创建一个可以夯住容器的脚本 vi /init.sh #!/bin/bash service php-fpm restart service nginx restart tail -f /etc/hosts 注:nginx -g 'deamon off;' 无法夯住.... #提交镜像 docker commit 8436ff4a76b8 kod:v1 #验证镜像 docker run -d -p 80:80 kod:v1 /bin/bash /init.sh
登录:10.0.0.12:80/index.php
镜像: 中药
dockerfile: 配方
FROM 基础镜像
RUN 制作镜像过程中需要的执行命令(安装服务)
CMD 容器启动的时候执行的初始命令,容易被替换(启动服务)
ENTRYPOINT 容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
ADD 把dockerfile当前目录下的文件拷贝到容器中(自动解压tar包)
COPY 把dockerfile当前目录下的文件拷贝到容器中(不解压tar包)
WORKDIR 指定容器的默认工作目录
EXPOSE 镜像要暴露的端口
VOLUME 持久化卷
ENV 环境变量(ssh的密码,数据库的密码)
LABEL 镜像的属性标签
MAINTAINER 管理者标识
dockerfile的通俗理解:
a: 手动制作docker镜像,记录历史命令
b:根据历史命令编写dockerfile文件
c:docker build构建docker镜像
d:测试镜像的功能
FROM centos:6.9 RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo RUN yum install nginx -y CMD ["nginx","-g","daemon off;"]
进行创建镜像
[root@docker02 centos_nginx]# docker image build -t centos6.9_nginx:v2 --network=host .
--network=host #直接使用宿主机网络
#提前开启一个kod容器,将创建kod容器的文件复制到kod目录下 docker cp friendly_davinci:/etc/php-fpm.d/www.conf . docker cp friendly_davinci:/etc/nginx/conf.d/default.conf . #夯住容器脚本 vim init.sh #!/bin/bash service php-fpm start nginx -g 'daemon off;' [root@docker02 kod]# ls default.conf www.conf init.sh
[root@docker02 kod]# cat default.conf server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /html; index index.php index.html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location ~ .php$ { root /html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /html$fastcgi_script_name; include fastcgi_params; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
www.conf文件:php目录下修改www.conf用户和组为nginx
#vim dockerfile FROM centos6.9_nginx:v1 RUN yum install php-fpm php-gd php-mbstring -y ADD www.conf /etc/php-fpm.d/www.conf ADD default.conf /etc/nginx/conf.d/default.conf RUN mkdir /html WORKDIR /html RUN curl -o kodexplorer4.40.zip http://static.kodcloud.com/update/download/kodexplorer4.40.zip RUN yum install unzip -y RUN unzip kodexplorer4.40.zip RUN chown -R nginx:nginx . ADD init.sh /init.sh CMD ["/bin/bash","/init.sh"]
docker build -t kod:v2 . docker run -d -p 80:80 kod:v2 --打开网页验证 10.0.0.12:80
dockerfile文件
#在docker文件内加入一下内容 RUN yum install openssh-server -y RUN service sshd start ADD init.sh /init.sh #重设密码 RUN echo "123456" | passwd --stdin root #初始化命令,夯住容器 CMD ["/bin/bash","/init.sh"]
init.sh脚本
#/bin/bash service sshd start service php-fpm start nginx -g "daemon off;"
测试服务
docker run -d -p 80:80 -p 1023:22 kod:v3 /bin/bash /init.sh docker exec -it <容器ID> ssh root@10.0.0.12 -p 1023 --登录宿主机的1023端口就是登录容器的22端口
FROM kod:v2 RUN yum install openssh-server -y RUN service sshd start ADD init.sh /init.sh EXPOSE 22 #开启22端口 CMD ["/bin/bash","/init.sh"] 或者 ENTRYPOINT ["/bin/bash","/init.sh"] #容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,cmd命令将作为ENTRYPOINT命令的参数
#/bin/bash #将密码加入脚本 echo "$SSH_PWD" | passwd --stdin root #密码可以命令参数 -e "SSH_PWD=123456" 传输进去 service sshd start service php-fpm start nginx -g 'daemon off;'
注:只要可以夯住容器启动tail -f /etc/hosts
也可以使用
3. 设置方式
方式一:
#命令行 -e 参数 docker run -d -P --env "SSH_PWD=654321" kod_ssh:v3 -e参数会写到全局环境变量 #容器env查看 SSH_PWD=654321 #远程登录,-P随机映射到了宿主机的32787端口 ssh root@10.0.0.12 -p 32787
方式二:
#在dockerfile加上ENV环境变量 ENV SSH_PWD 654321
docker里的镜像绝大部分都是在别的镜像的基础上去进行创建的,也就是使用镜像的分层结构。
镜像和分层
docker 负责堆叠这些镜像层,并且将它们表示为统一的对象。
# docker image inspect centos:6.9 "Type": "layers", "Layers": [ "sha256:b5e11aae8a8e8fab750bd384393aafa379e21c57c398f5dd4980cd01fcf55b9e" ]
docker history
查看centos镜像构建历史
# docker history centos:6.9 IMAGE CREATED CREATED BY SIZE COMMENT adf829198a7f 18 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 18 months ago /bin/sh -c #(nop) LABEL name=CentOS Base Im… 0B <missing> 18 months ago /bin/sh -c #(nop) ADD file:b99efdfca7b4df4ef… 195MB
有些dockerfile 中的指令并不会创建新的镜像层。比如ENV、EXPOSE、CMD
以及ENTRY-POINT
。不过,这些命令会在镜像中添加元数据。
所有的docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
例:基于Ubuntu Linux 16.0.4
创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加python
包,就会在基础镜像层之上创建第二层镜像层层;如果继续添加一个安全补丁,就会添加第三个镜像层。
该镜像当前已经包含3个镜像层,如图所示
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含 3 个文件,而镜像包含了来自两个镜像层的 6 个文件。
上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有 6 个文件,这是因为最上层中的文件 7 是文件 5 的一个更新版本。
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Linux 上可用的存储引擎有 AUFS、Overlay2、Device Mapper、Btrfs 以及 ZFS
。顾名思义,每种存储引擎都基于 Linux 中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker 在 Windows 上仅支持 windowsfilter 一种存储引擎,该引擎基于 NTFS 文件系统之上实现了分层和 CoW[1]。
分层的优点
a: 使用体积小的linux镜像alpine
b:尽可能的清理无用的缓存文件
c:修改dockerfile的时候,尽可能把修改的内容放在最后
d:使用.dockerignore忽略构建docker镜像时,不需要的文件
docker pull alpine docker run -it alpine:latest # sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories # apk update # apk add nginx # mkdir /run/nginx # nginx # nginx -v # apk add php7 php7-fpm php7-opcache php7-curl php7-gd php7-mbstring php7-mysqli php7-json php7-iconv php7-exif php7-ldap php7-pdo php7-session php7-xml # apk add openrc --no-cache # mkdir -p /run/openrc # touch /run/openrc/softlevel # service php-fpm7 start # rc-update add nginx default # rc-upfate add php-fpm7 default # vim /etc/nginx/conf.d/default.conf server { listen 80 default_server; listen [::]:80 default_server; location / { root /html; index index.php index.html; include /etc/nginx/conf.d./*.conf; location ~ .php$ { root /html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /html$fastcgi_script_name; include fastcgi_params; } } # You may need this to prevent return 404 recursion. location = /404.html { internal; } } # nginx -t # mkdir /html # cd /html # wget http://static.kodcloud.com/update/download/kodexplorer4.40.zip # unzip kodexplorer4.40.zip # chown -R nginx:nginx . #启动脚本文件编写 vim /etc/init.sh nginx php-fpm7 -D tail -f /etc/hosts
构建镜像:
docker commit <容器名称> alpine_kod:v1 docker run -d -p 80:80 alpine_kod:v1 /bin/sh /init.sh
-
-
准备启动
init.sh
文件 -
FROM alpine:latest RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories RUN apk update RUN apk add nginx php7 php7-fpm php7-opcache php7-curl php7-gd php7-mbstring php7-mysqli php7-json php7-iconv php7-exif php7-ldap php7-pdo php7-session php7-xml openrc --no-cache RUN mkdir /run/nginx && mkdir /run/openrc && touch /run/openrc/softlevel && mkdir /html RUN cd /html && wget http://static.kodcloud.com/update/download/kodexplorer4.40.zip && unzip kodexplorer4.40.zip RUN chmod -R 777 /html WORKDIR /html COPY init.sh /init.sh COPY default.conf /etc/nginx/conf.d/default.conf EXPOSE 80 CMD ["/bin/sh","/init.sh"]
构建:
docker bulid -t alpine_kod:v2 --> 构建 docker run -d -p 81:80 alpine_kod:v2 --> 后台启动测试 docker exec -it alpine_kod:v2 /bin/sh --> 前台进入
#创建一个容器名字问web的容器 docker run -d -p 80:80 --name web01 alpine:v1 /bin/sh /init.sh #alpine_kod:v2进行互联 [root@docker01 ~]# docker run -it --link web01 alpine_kod:v2 /bin/sh /html # cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 web01 ff5b38ba60a5 172.17.0.3 f77cd0a895aa
zabbix官网文档docker介绍:https://www.zabbix.com/documentation/4.0/zh/manual/installation/containers
zabbix-github地址:https://github.com/zabbix/zabbix-docker
docker pull mysql:5.7 docker pull zabbix-java-gateway:latest docker pull zabbix-server-mysql:latest docker pull zabbix-web-nginx-mysql:latest #导入 for n in `ls ./*.tar.gz` ;do docker load -i $n ;done
容器启动:
# 首先,启动空的 MySQL 服务器实例 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 # 其次,启动 Zabbix Java gateway 实例 docker run --name zabbix-java-gateway -t -d zabbix/zabbix-java-gateway:latest # 然后,启动 Zabbix server 实例,并将其关联到已创建的 MySQL server 实例。 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 # 最后,启动 Zabbix Web 界面,并将其关联到已创建的 MySQL server 和 Zabbix server 实例。 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
登录:
10.0.0.11
登录名:Admin 密码:zabbix
#需要扩展源 curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #下载 yum install docker-compose -y
官方下载方式:
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose #如果安装失败可以指向/usr/bin sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose docker-compose --version
docker-compose --help #常用命令 up(创建并启动服务) down(停止服务,并删除) stop(停止服务) start -d (启动服务,-d后台启动服务) restart(重启服务) #其他命令 exec(登录容器) ps(显示所有容器) build(构建镜像) build(不带缓存的构建) rm(删除容器) pause(暂停nginx容器) unpause(恢复容器) kill(停止指定服务的容器)
使用Compose基本上是一个三步过程:
-
使用定义您的应用环境,
Dockerfile
以便可以在任何地方复制。 -
定义组成应用程序的服务,
docker-compose.yml
以便它们可以在隔离的环境中一起运行。 -
Run
mkdir -p /opt/dock-compose/zabbix cat /opt/docker-compose/zabbix/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 #构建 [root@docker01 zabbix]# docker-compose up 访问:10.0.0.11
注:docker-compose版本v1 v2 v3, 每一一个版本语法,功能不一样 docker- compose中不需要link,↓docker- compose内部提供dns功能,通过service的名字来通信,双向通讯