1 DOCKER 基本结构
Docker客户端:Docker是C/S的应用架构模型,一般客户端和服务端都在同一个二进制文件中。所以通常我们都可以通过Docker命令来运行相关操作。
但是也可以通过用于程序基于API来操作。
Docker daemon:Docker 的服务端,通常表示的包都是Docker Engine,接受用户请求,并进行相关操作。
容器:相当于虚拟机的概念,但是简化成一个相互隔离的操作系统,无需我们关系具体细节,我们像集装箱一样打包就用即可。
镜像:容器的基础,通过Unionfs文件系统特性,实现不同镜像堆叠。是启动容器的一个基础。用Dockerfile可以方便定制。
Registry:存放镜像的地方,通过Registry我们就可以实现容器镜像的打包带走。
2 DOCKER 常用命令
2.1 Docker 镜像管理
一、显示本地镜像:
[root@test mnt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
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
二、镜像查找:
[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]
三、镜像删除:
docker rmi image id (当容器存在的时候删不掉,应该先删除镜像再删除容器)
四、镜像拉取和推送
Docker pull 即可
五、查看镜像的具体信息:
[root@test mnt]# docker inspect f3c5dcc79825 ##可以看到相关具体配置,和镜像分层。
2.2 Docker 容器管理
一、创建容器:
docker create nginx(镜像名)
二、查看运行容器:
[root@node3 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
三、查看所有容器:
docker ps -a (显示所有的容器,包括未运行的)
四、启动容器
docker start nginx(容器名/id) 启动容器
五、运行容器:
[root@test mnt]# docker run -d --name web(容器别名) nginx(镜像名)
六、删除容器:
[root@test mnt]# docker rm -f web(容器名/id) -f 强制删除
七、进入容器:
[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这个文件
三、测试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
##切换当前工作目录,写建议写绝对路径,写相对路径会叠加。
11、ONBUILD(在子镜像中执行)
ONBUILD <Dockerfile关键字>
##ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。
USER(设置container容器的用户)
User nginx
##容器执行时候指定的用户,默认是root:
arg
格式:ARG<name>[=<default value>]
##解释:ARG指定了一个变量在docker build的时候使用,可以使用--build-arg <varname>=<value>来指定参数的值,不过如果构建的时候不指定就会报错。
4.2 构建一个tomcat镜像示例
一、创建目录新建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
二、编写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
3、用supervisor来管理进程:
[root@docker-registry tomcat]# cat supervisord.conf
[supervisord]
nodaemon=true
[program:tomcat]
command=/opt/apache-tomcat-7.0.55/bin/catalina.sh run
4、开始构建:
[root@docker-registry tomcat]# docker build -t icfw/tomcat:1.0 .
5、运行:
[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
6、访问一下
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 上传镜像
1、 配置镜像注册地址并重启docker服务:
[root@docker-registry ~]# vi /etc/docker/daemon.json
{"registry-mirrors": ["http://681a96df.m.daocloud.io"],"insecure-registries":["http://192.168.20.20:5000"]}
2、 本地镜像打个标签然后上传:
[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表示版本号。
3、 直接上传:
[root@docker-registry test]# docker push 192.168.20.20:5000/icfw/tomcat:1.0
4、 上传完成,我们可以查看一下挂载目录是否有镜像:
[root@docker-registry test]# ls /registry/
dockerDocker
5、 关于本地镜像的查看:
[root@docker-registry test]# curl http://192.168.20.20:5000/v2/_catalog
{"repositories":["icfw/tomcat"]}
6、 看到有两个镜像,我们要获取他的标签信息以便下载呢:
[root@docker-registry test]# curl http://192.168.20.20:5000/v2/icfw/tomcat/tags/list
{"name":"icfw/tomcat","tags":["1.0"]}
7、 然后我们直接下载镜像:
[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 开始构建和启动
1、配置文件
[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
2、创建并启动
[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
3、删除指定容器:先停止容器,再执行删除:
docker-compose -f docker-compose.yml stop vcs
docker-compose -f docker-compose.yml rm vcs ##即可。
6.4 查看日志
1、 查看启动日志
[root@dev-app-server vcs-project]# docker-compose -f docker-compose.yml logs
2、 查看相关状态:
[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 访问测试
1、映射web目录已经添加了framework-web.war,vcs-web.war了,可通过http://192.168.20.15:8080/frmamework-web访问测试。
来源:51CTO
作者:wx5bcc50890840d
链接:https://blog.51cto.com/14034751/2445980