1 DOCKER 基本结构php
Docker客户端:Docker是C/S的应用架构模型,通常客户端和服务端都在同一个二进制文件中。因此一般咱们均可以经过Docker命令来运行相关操做。node
可是也能够经过用于程序基于API来操做。python
Docker daemon:Docker 的服务端,一般表示的包都是Docker Engine,接受用户请求,并进行相关操做。mysql
容器:至关于虚拟机的概念,可是简化成一个相互隔离的操做系统,无需咱们关系具体细节,咱们像集装箱同样打包就用便可。nginx
镜像:容器的基础,经过Unionfs文件系统特性,实现不一样镜像堆叠。是启动容器的一个基础。用Dockerfile能够方便定制。git
Registry:存放镜像的地方,经过Registry咱们就能够实现容器镜像的打包带走。github
2 DOCKER 经常使用命令
2.1 Docker 镜像管理
1、显示本地镜像:web
[root@test mnt]# docker imagessql
REPOSITORY TAG IMAGE ID CREATED SIZEdocker
upstram_nginx latest f3c5dcc79825 9 days ago 669 MB
lnmp/nginx 0.2 9fe8cdcb3e43 9 days ago 669 MB
lnmp/mysql 1.0 2c612a810853 10 days ago 374 MB
lnmp/php 1.0 fc59ef00ea8a 10 days ago 1.23 GB
2、镜像查找:
[root@test mnt]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 5508 [OK]
jwilder/nginx-proxy Automated Nginx reverse... 961 [OK]
richarvey/nginx-php-fpm Container running Nginx 354 [OK]
million12/nginx-php Nginx + PHP-FPM 5.5, 5.6,. 76 [OK]
3、镜像删除:
docker rmi image id (当容器存在的时候删不掉,应该先删除镜像再删除容器)
4、镜像拉取和推送
Docker pull 便可
5、查看镜像的具体信息:
[root@test mnt]# docker inspect f3c5dcc79825 ##能够看到相关具体配置,和镜像分层。
2.2 Docker 容器管理
1、建立容器:
docker create nginx(镜像名)
2、查看运行容器:
[root@node3 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3、查看全部容器:
docker ps -a (显示全部的容器,包括未运行的)
4、启动容器
docker start nginx(容器名/id) 启动容器
5、运行容器:
[root@test mnt]# docker run -d --name web(容器别名) nginx(镜像名)
6、删除容器:
[root@test mnt]# docker rm -f web(容器名/id) -f 强制删除
7、进入容器:
[root@test mnt]# docker exec -it nginx(容器名/id) /bin/bash
2.3 Docker Volume
Docker Volume(卷)的概念,简单来讲,Volume就是目录或者文件,它能够绕过容器系统,而以正常的文件或者目录的形式存在于宿主机上。适用于容器外持久化存储文件,或共享文件。挂载文件/目录到容器:
docker run -itd -v /opt/webapps(本地文件或目录):/opt/apache-tomcat-7.0.55/webapps(容器内文件或目录) -p 80:8080 --name tomcat icfw/tomcat:1.0
注:默认文件可读可写,指定挂载权限可自行参考docker手册。
3 DOCKER 快速安装
3.1 软件版本
操做系统:Centos 7.0
3.2 开始安装
http://www.daocloud.io/
因为国内的源比较卡,因此咱们推荐使用daocloud的方式,调用远程脚本,安装便可:
[root@test ~]# curl -sSL https://get.daocloud.io/docker | sh
#为了快速拉取镜像,还要daocloud.由于在国内一般拉取Docker hub的镜像都是被墙的。
[root@test ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://681a96df.m.daocloud.io
docker version >= 1.12
{"registry-mirrors": ["http://681a96df.m.daocloud.io"],
"live-restore": true
}
Success.
You need to restart docker to take effect: sudo systemctl restart docker
##其实是相关配置写入/etc/docker/daemon.json:指定去这个仓库下,由于默认是去官方的Docker hub下载镜像的。
[root@test ~]# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://681a96df.m.daocloud.io"],
"live-restore": true
}
##编辑配置文件(/usr/lib/systemd/system/docker.service),容许使用docker 客户端远程链接。
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
而后重启docker:
systemctl restart docker
##查看docker状态,docker 读取的是哪一个配置文件:
[root@test ~]# systemctl status docker
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Sat 2017-03-11 16:43:51 CST; 1min 11s ago
Docs: https://docs.docker.com
###这里咱们知道centos读取的是/usr/lib/systemd/system/docker.service这个文件
3、测试docker是否启动正常:
[root@master ~]# docker -H 127.0.0.1:2375 images
4 DOCKER 镜像制做
4.1 DOCKER FILE 指令
DOCKER提倡使用Dockfile的方式来构建镜像,Dockerfile是Docker的解释型语言,经过提交Dockerfile来实现对镜像的构建。
Dockerfile忽略大小写,注释用#开头,
FROM指令:
FROM centos:centos7
##表示基础镜像来自哪里,本地镜像没有就从仓库获取,指令必须放在最前面第一条。
MAINTAINER(用来指定镜像建立者信息)
MAINTAINER admin admin@icfw.com.cn
##镜像构建做者的相关信息
RUN(执行相关的系统命令)
格式:RUN <command> 或者 RUN ["executable","param1","param2"]
RUN yum install supervisor –y
CMD(系统启动时候执行指令,可是会被第一条启动所覆盖)
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给须要交互的应用;
CMD ["param1","param2"] 提供给ENTRYPOINT的默认参数;
##CMD指定容器启动是执行的命令,每一个Dockerfile只能有一条CMD命令,若是指定了多条,只有最后一条会被执行。若是你在启动容器的时候也指定的命令,那么会覆盖Dockerfile构建的镜像里面的CMD命令。
ENTRYPOINT(也是系统启动执行命令)
格式:
ENTRYPOINT ["executable", "param1","param2"]
ENTRYPOINT command param1 param2(shell中执行)。
##和CMD同样也是最后一条命令执行,可是和CMD不一样的是,CMD命令会被docker run 中执行的命令所覆盖,固然二者能够结合:
ENTRYPOINT ["python", "/test.py"]
CMD ["sleep", "10"]
##在启动的时候等于就执行了,python /test.py sleep 10
##注意
当独自使用时,若是你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效。
EXPOSE(指定容器须要映射到宿主机器的端口)
EXPOSE <port> [<port>...]
##在编写Docker的时候暴露容器的端口,可是只是在内部暴露,外部想映射还须要-p选项
VOLUME(指定挂载点))
VOLUME ["<mountpoint>"]
##是文件能够持久化存在,或者在容器之间共享数据。
ENV(用于设置环境变量)
ENV <key> <value>
##构建镜像和容器启动时候均可以使用
ADD与COPY
ADD <src> <dest>
##两个都是复制本机文件到镜像里,区别是ADD若是文件是可识别的压缩格式,则docker会帮忙解压缩.
WORKDIR
WORKDIR /path/to/workdir
##切换当前工做目录,写建议写绝对路径,写相对路径会叠加。
十一、ONBUILD(在子镜像中执行)
ONBUILD <Dockerfile关键字>
##ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。
USER(设置container容器的用户)
User nginx
##容器执行时候指定的用户,默认是root:
arg
格式:ARG<name>[=<default value>]
##解释:ARG指定了一个变量在docker build的时候使用,可使用--build-arg <varname>=<value>来指定参数的值,不过若是构建的时候不指定就会报错。
4.2 构建一个tomcat镜像示例
1、建立目录新建Dockerfile和相关包:
[root@docker-registry images]# tree tomcat/
tomcat/
├── apache-tomcat-7.0.55.tar.gz
├── Centos-7.repo
├── Dockerfile
├── epel-7.repo
├── jdk1.8.0_181.tar.gz
├── server.xml
└── supervisord.conf
2、编写Dockerfile:
[root@docker-registry tomcat]# cat Dockerfile
#pull down centos image
FROM centos:centos7
MAINTAINER chenjixiong@icfw.com.cn
ADD epel-7.repo /etc/yum.repos.d/
ADD Centos-7.repo /etc/yum.repos.d/
RUN yum install -y net-tools
RUN yum install -y iputils
RUN yum install -y supervisor
RUN mkdir -p /var/log/supervisor
ADD ./apache-tomcat-7.0.55.tar.gz /opt
ADD ./server.xml /opt/apache-tomcat-7.0.55/conf
ADD ./jdk1.8.0_181.tar.gz /opt
#set environment variable
ENV JAVA_HOME /opt/jdk1.8.0_181
ENV PATH $JAVA_HOME/bin:$PATH
ENV CATALINA_HOME /opt/apache-tomcat-7.0.55
ENV PATH $PATH:$CATALINA_HOME/bin
EXPOSE 8080
COPY supervisord.conf /etc/supervisor/supervisord.conf
CMD supervisord -c /etc/supervisor/supervisord.conf
三、用supervisor来管理进程:
[root@docker-registry tomcat]# cat supervisord.conf
[supervisord]
nodaemon=true
[program:tomcat]
command=/opt/apache-tomcat-7.0.55/bin/catalina.sh run
四、开始构建:
[root@docker-registry tomcat]# docker build -t icfw/tomcat:1.0 .
五、运行:
[root@node3 tomcat]# docker run -dit -p 8080:8080 --name tomcat i/tomcat:1.0
c29c5aaf63a73126e6976c02b1c9bd06e0a0af6514d9c697e1128ddb3a27
[root@docker-registry tomcat]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fdc4e4f09938 icfw/tomcat:1.0 "/bin/sh -c 'supervi…" 33 seconds ago Up 32 seconds 0.0.0.0:8080->8080/tcp tomcat
六、访问一下
IP:8080便可。
5 DOCKER 私有仓库搭建
5.1 下载镜像仓库
[root@docker-registry test]# docker pull registry
5.2 启动而且挂载镜像仓库到本地磁盘
[root@docker-registry test]# docker run -d -p 5000:5000 --restart=always -v /registry:/var/lib/registry registry
5.3 上传镜像
一、 配置镜像注册地址并重启docker服务:
[root@docker-registry ~]# vi /etc/docker/daemon.json
{"registry-mirrors": ["http://681a96df.m.daocloud.io"],"insecure-registries":["http://192.168.20.20:5000"]}
二、 本地镜像打个标签而后上传:
[root@docker-registry test]# [root@docker-registry test]# docker tag icfw/tomcat:1.0 192.168.20.20:5000/icfw/tomcat:1.0
#192.168.20.20:5000表示仓库地址,icfw/tomcat表示镜像名称,1.0表示版本号。
三、 直接上传:
[root@docker-registry test]# docker push 192.168.20.20:5000/icfw/tomcat:1.0
四、 上传完成,咱们能够查看一下挂载目录是否有镜像:
[root@docker-registry test]# ls /registry/
dockerDocker
五、 关于本地镜像的查看:
[root@docker-registry test]# curl http://192.168.20.20:5000/v2/_catalog
{"repositories":["icfw/tomcat"]}
六、 看到有两个镜像,咱们要获取他的标签信息以便下载呢:
[root@docker-registry test]# curl http://192.168.20.20:5000/v2/icfw/tomcat/tags/list
{"name":"icfw/tomcat","tags":["1.0"]}
七、 而后咱们直接下载镜像:
[root@docker-registry test]# docker pull 192.168.20.20:5000/icfw/tomcat:1.0
6 使用Docker compose容器编排
Docker Compose是一个用来定义和运行复杂应用的Docker工具。使用Compose,你能够在一个文件中定义一个多容器应用,而后使用一条命令来启动你的应用,完成一切准备工做。
经过compose构建相关容器编排很是简单,能够参考官方:
https://docs.docker.com/compose/gettingstarted/#step-4-build-and-run-your-app-with-compose
6.1 compose安装:
[root@dev-app-server ~]# sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@dev-app-server ~]# chmod +x /usr/local/bin/docker-compose
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.7
OpenSSL version: OpenSSL 1.1.0f 25 May 2017
相关语法:
build 构建或重建服务
help 命令帮助
kill 杀掉容器
logs 显示容器的输出内容
port 打印绑定的开放端口
ps 显示容器
pull 拉取服务镜像
restart 重启服务
rm 删除中止的容器
run 运行一个一次性命令
scale 设置服务的容器数目
start 开启服务
stop 中止服务
up 建立并启动容器
6.2 compose的构建语法
docker compose构建语法和相关格式很是简单,与docker相关命令差很少,咱们直接进入实战部分,构建安全码系统测试环境:
##image和build必须存在一个,为了节约时间,咱们没有用dockerfile构建一个镜像,剩下的指令基本上和docker run同样的因此这里很少介绍。
6.3 开始构建和启动
一、配置文件
[root@dev-app-server vcs-project]# cat docker-compose.yml
version: "2"
services:
framework:
image: 192.168.20.20:5000/icfw/tomcat:1.0 ports: - 8080:8080 environment: ICFW_FRMEWORK_HOME: /opt/env volumes: - /opt/vcs-project/framework:/opt/apache-tomcat-7.0.55/webapps - /opt/vcs-project/env/icfw-framework:/opt/env - /opt/vcs-project/icfwfiles:/opt/icfwfiles
vcs:
image: 192.168.20.20:5000/icfw/tomcat:1.0 ports: - 8081:8080 environment: VCS_HOME: /opt/env volumes: - /opt/vcs-project/vcs:/opt/apache-tomcat-7.0.55/webapps - /opt/vcs-project/env/vcs-home:/opt/env - /opt/vcs-project/icfwfiles:/opt/icfwfiles links: - framework
二、建立并启动
[root@dev-app-server vcs-project]# docker-compose -f docker-compose.yml up -d
Creating vcs-project_framework_1 ... done
Creating vcs-project_vcs_1 ... done
三、删除指定容器:先中止容器,再执行删除:
docker-compose -f docker-compose.yml stop vcs
docker-compose -f docker-compose.yml rm vcs ##便可。
6.4 查看日志
一、 查看启动日志
[root@dev-app-server vcs-project]# docker-compose -f docker-compose.yml logs
二、 查看相关状态:
[root@dev-app-server vcs-project]# docker-compose -f docker-compose.yml ps
Name Command State Ports
vcs-project_framework_1 /bin/sh -c supervisord -c ... Up 0.0.0.0:8080->8080/tcp
vcs-project_vcs_1 /bin/sh -c supervisord -c ... Up 0.0.0.0:8081->8080/tcp
6.5 访问测试
一、映射web目录已经添加了framework-web.war,vcs-web.war了,可经过http://192.168.20.15:8080/frmamework-web访问测试。