OS需求:html
卸载旧版本docker:node
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
安装需求包:python
yum -y install epel-release yum -y install libseccomp iptables iptables-services systemctl stop firewalld systemctl disable firewalld systemctl enable iptables systemctl start iptables iptables -F # 清空iptables全部规则 iptables -X # 清空用户配置 iptables -Z # 计数器清零 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 添加远程端口 service iptables save systemctl restart iptables
安装需求数据包,yum-utils
提供了yum-config-manager
实用工具,device-mapper-persistent-data
和lvm2
提供了devicemapper
存储驱动器。linux
yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
设置仓库web
yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
激活edge和test 仓库,默认是关闭的。redis
yum-config-manager --enable docker-ce-edge yum-config-manager --enable docker-ce-test
关闭docker
yum-config-manager --disable docker-ce-edge
# 查看docker-ce列表 yum list docker-ce --showduplicates| sort -r # 能够指定安装docker-ce版本 yum install docker-ce-<VERSION STRING> # 这里使用如下,安装最新版本 yum -y install docker-ce
docker安装完之后并无启动,并在系统中自动建立了docker group,但并无用户在docker group里边。json
# 查看已经建立的组 [root@localhost ~]# cat /etc/group | grep docker docker:x:996:
systemctl start docker systemctl enable docker
docker run hello-world
flask
运行这个命令,会从docker hub下载一个‘hello-word’镜像,而且用‘hello-word’镜像 建立一个新的容器运行。当运行容器的时候,会打印一些信息后并自动退出。centos
rpm下载连接:<https://download.docker.com/linux/centos/7/x86_64/stable/Packages/>;
安装rpm包:
yum install docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
接下来就是启动,同上。
$ curl -fsSL https://get.docker.com -o get-docker.sh $ sudo sh get-docker.sh
注意 :须要手动制做启动脚本。
$ sudo yum remove docker-ce # 须要手动删除images、container、valumes、自定义的配置文件。 $ sudo rm -rf /var/lib/docker
docker version
建立用户,并将用户添加到docker组
useradd docker -g docker su - docker docker run hello-world
docker image ls
docker container ls --all
docker container --help
docker version 查看docker版本
docker info 查看docker详细信息
docker run hello-world
[docker@localhost ~]$ docker container ls --help Usage: docker container ls [OPTIONS] Options: -a, --all 显示全部容器 (默认不加任何选项只显示运行的容器) -f, --filter filter Filter output based on conditions provided --format string Pretty-print containers using a Go template (docker container ls -af name=h #打印容器名字包含h的容器列表) -n, --last int Show n last created containers (includes all states) (default -1) -l, --latest 显示最新建立的容器 -q, --quiet 仅仅显示容器ID -s, --size 显示容器信息再加上容器文件总大小
解决办法:yum -y install libseccomp
DOCKER-ISOLATION':No such file or directory#012#012Try
iptables -h' or 'iptables --help' for more information.解决办法:yum -y install iptables
Containers 的CI/CD 是完美无缺。例如:
使用docker,应用程序缩放是一个问题,就是编制新的可执行文件,而不是运行大量的vm主机。
用Docker方式构建一个应用程序,层次结构从底层开始,这个应用程序是一个container;高于此级别是一个service,它定义了容器在生产中的行为方式;最后是stack(堆栈)。
建立一个空目录,并cd 切换到新目录中,
[docker@localhost ~]$ mkdir pythonweb [docker@localhost ~]$ cd pythonweb/
建立一个Dockerfile,添加如下内容:
# 使用正式的Python运行时做为父映像 FROM python:2.7-slim # 设置工做目录为 /app WORKDIR /app # 复制当前目录的内容到容器 /app目录里 ADD . /app # 安装requirements.txt 需求的数据包 RUN pip install --trusted-host pypi.python.org -r requirements.txt # 对外开放容器的80端口 EXPOSE 80 # 定义环境变量 ENV NAME World # 当容器启动时,运行app.py CMD ["python","app.py"]
接下来建立requirements.txt文件
[docker@localhost pythonweb]$ vi requirements.txt Flash Redis
建立app.py文件
[docker@localhost pythonweb]$ vi app.py from flask import Flask from redis import Redis, RedisError import os import socket # Connect to Redis redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2) app = Flask(__name__) @app.route("/") def hello(): try: visits = redis.incr("counter") except RedisError: visits = "<i>cannot connect to Redis, counter disabled</i>" html = "<h3>Hello {name}!</h3>" \ "<b>Hostname:</b> {hostname}<br/>" \ "<b>Visits:</b> {visits}" return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits) if __name__ == "__main__": app.run(host='0.0.0.0', port=80)
用Build命令建立一个Docker image,使用-t 指定一个 镜像名字
docker build -t python-web-test .
查看建立的“python-web-test”镜像
[docker@localhost pythonweb]$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE python-web-test latest 075bace69a76 About a minute ago 132MB
为Docker守护进程设置DNS
这里要切换到root,建立/etc/docker/daemon.json文件
[root@localhost ~]# vi /etc/docker/daemon.json { "dns": ["119.29.29.29", "202.106.0.20"] } # 设置完成后要重启docker服务 [root@localhost ~]# systemctl restart docker # 也要从新运行如下刚才的build su - docker cd pythonweb/ docker build -t python-web-test .
运行应用程序
docker run -p 4000:80 python-web-test
[docker@localhost pythonweb]$ docker run -p 4000:80 python-web-test * Serving Flask app "app" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:80/ (Press CTRL+C to quit) 172.16.100.1 - - [27/Aug/2018 08:13:26] "GET / HTTP/1.1" 200 -
web浏览器验证
也能够命令行验证:
[docker@localhost pythonweb]$ curl localhost:4000 <h3>Hello World!</h3><b>Hostname:</b> 017c03c8de0b<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
以分离模式运行该应用程序
能够先用ctrl+c 结束当前进程。
而后运行:docker run -d -p 4000:80 python-web-test
[docker@localhost pythonweb]$ docker run -d -p 4000:80 python-web-test a255126065c1aa45ce4bff026ea9e7869efc527abfb9989fef63716428a7d7c6 # -d 以分离的模式运行容器,并返回容器ID
登陆:docker login
[docker@localhost ~]$ docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: 506554897 Password: WARNING! Your password will be stored unencrypted in /home/docker/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
给镜像指定tag
docker tag python-web-test 506554897/python-web-test:part1 # python-web-test是上边建立的container # 506554897: 是hub.docker.com注册的用户名 # python-web-test:是仓库名(repository) # part1 :是tag # 查看标记完image的docker image ls [docker@localhost ~]$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE 506554897/python-web-test part1 075bace69a76 About an hour ago 132MB python-web-test latest 075bace69a76 About an hour ago 132MB
上传镜像到[hub.docker.com]
docker push 506554897/python-web-test:part1
[docker@localhost ~]$ docker push 506554897/python-web-test:part1 The push refers to repository [docker.io/506554897/python-web-test] 03db24dfec4f: Pushed 7b4c7a03b2a4: Pushed a0857e348458: Pushed 1ea4f6a807ba: Mounted from library/python fda4dc055a55: Mounted from library/python e8fc09a140cf: Mounted from library/python cdb3f9544e4c: Mounted from library/python part1: digest: sha256:8a5c72b23b7b581adf37f396a0cd27796c15c816d82ce813fab415c96b516191 size: 1788
到官网就能够看到已经上传的镜像了:
如今就能够在别的docker机器上下载运行这个镜像了
docker run -p 4001:80 506554897/python-web-test:part1
docker build -t image-name . # . 表明当前目录 # image-name :建立镜像的名字
docker run -p 4000:80 image-name
docker run -d -p 4001:80 image-name
docker container ls
docker container ls -a
docker container stop container-id
docker container kill container-id
ocker container rm container-id
docker container rm $(docker container ls -a -q) # -a:显示全部运行、未运行的容器 # -q:仅仅显示容器ID
docker image ls -a
docker image rm image-id
docker image rm $(docker image ls -a -q)
docker login
docker tag image-name username/repository-name:tag
docker push username/repository-name:tag
docker run username/repository-name:tag
services实际上就是“生产中的container”。services运行一个image,它编码了image的运行方式、应该使用哪些端口,应该运行多少个容器副本,以便服务具备所需的容量。
扩展服务会改变运行该软件的容器实例的数量,为流程中的服务分配更多的计算资源。
在docker平台定义、运行和扩展服务很是容易,只需编写一个docker-compose.yml
文件。
[docker@localhost ~]$ vi docker-compose.yml version: "3" services: web: #replace username/repository:tag with your name and image details. image: 506554897/python-web-test:part1 deploy: #容许副本数为 5 replicas: 2 resources: limits: #每一个cpu最多使用10%(在全部核中) cpus: "0.1" memory: 50M #若是容器失败,当即从新启动容器 restart_policy: condition: on-failure #将主机的4000端口映射到 容器的80端口 ports: - "4000:80" # web经过负载平衡webnet网络共享端口80 networks: - webnet # 定义webnet具备默认设置的网络(这是一个负载平衡的覆盖网络) networks: webnet:
docker swarm init
启动群集模式,并使当前机器成为群集管理器。
[docker@localhost ~]$ docker swarm init Swarm initialized: current node (htyhmotwa88rb2it9dkfh9c9o) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4dc36dlf6g6ykl8k1q6hhhegi4pjmv390qlpgyj1cydf7koo7u-8n54mzvaicqtrhafmc8od3h6b 172.16.100.20:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
注意: 使用集群的时候,若是不运行该命令,会报错“this node is not a swarm manager ”
docker stack deploy -c docker-compose.yml python-test-web
[docker@localhost ~]$ docker stack deploy -c docker-compose.yml python-test-web Creating network python-test-web_webnet Creating service python-test-web_web # pyton-test-web:应用程序的名字,自定义就行。
docker service ls
[docker@localhost ~]$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS zzevktay14av python-test-web_web replicated 5/5 506554897/python-web-test:part1 *:4000->80/tcp
在服务中运行的单个容器成为task。任务被赋予惟一的ID,该ID在数字上递增,列出服务的task:
docker service ps python-test-web_web
[docker@localhost ~]$ docker service ps python-test-web_web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS skvezw77ra63 python-test-web_web.1 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago vlxrofm9mbp1 python-test-web_web.2 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago ar7tr2213d92 python-test-web_web.3 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago lolilmuenas4 python-test-web_web.4 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago h9a1wrhkee1w python-test-web_web.5 506554897/python-web-test:part1 localhost.localdomain Running Running 10 minutes ago
查看系统运行的container也能够列出应用程序的全部task。
[docker@localhost ~]$ docker container ls -q b8d43f336d17 a4734d25f376 7ac3d4ecd07e 7946461cd7c1 95a9f0c09dfc
应用程序对于每一个客户端的每一个请求,将以循环方式选择5个任务中的一个来响应。容器ID与前面命令的输出相匹配(docker container ls -q)
replicas: 2
docker stack deploy -c docker-compose.yml python-test-web
[docker@localhost ~]$ docker stack deploy -c docker-compose.yml python-test-web Updating service python-test-web_web (id: zzevktay14avptf4e4dwxmv1r)
docker执行就地更新,不须要stop容器或kill容器。
#从新启动应用程序后,查看应用程序的task [docker@localhost ~]$ docker service ps python-test-web_web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS skvezw77ra63 python-test-web_web.1 506554897/python-web-test:part1 localhost.localdomain Running Running 25 minutes ago vlxrofm9mbp1 python-test-web_web.2 506554897/python-web-test:part1 localhost.localdomain Running
docker stack rm python-test-web
[docker@localhost ~]$ docker stack rm python-test-web Removing service python-test-web_web Removing network python-test-web_webnet
docker swarm leave --force
[docker@localhost ~]$ docker swarm leave --force Node left the swarm.
docker stack ls
docker stack deploy -c docker-compose.yml appname # docker-compose.yml :composefile # appname: 应用程序名字
docker service ls
docker service ps appname # appname: 应用程序名字
docker inspect <task-id or container-id or service-name>
docker container ls -q # -q:只显示容器ID
docker stack rm python-test-web # python-test-web :应用程序名字
docker swarm init docker swarm leave --force
集群就是讲几台能够运行docker的主机加入到群集中。集群中的机器能够是物理的,也能够是虚拟的,加入swarm clusters以后,这些主机成为节点。当加入群集以后,运行docker命令要在群管理器上运行。
群管理器可使用集中策略来运行容器,好比“最空的节点”-用容器填充利用率最低的机器。或者“全局”,它确保每台机器都获得指定容器的一个实例。您指示群管理器在撰写文件中使用这些策略,就像您已经使用过的策略同样。
群管理器(Swarm managers ):集中管理执行命令或受权其余机器加入群集的机器。
节点(workers):只提供资源和接受指令,没有权利执行或受权命令。
集群管理端口:2377
docker守护进程端口:2376
docker swarm init
[root@docker-1 ~]# docker swarm init Swarm initialized: current node (hzo1e9ux1qounpcdujyz10pks) is now a manager. To add a worker to this swarm, run the following command: # 增长主机到集群,请执行以下命令 docker swarm join --token SWMTKN-1-2yn0609winru1y5tsk00y9t54nh40thsvb7rjymfih5oz4ymy3-bgssyx8nlm0eiy0y4j8ugvsdh 172.16.100.20:2377 To add a manager to this swarm, # 增长一个群集管理请运行以下: run 'docker swarm join-token manager' and follow the instructions.
iptables -A INPUT -p tcp --dport 2377 -j ACCEPT service iptables save systemctl restart iptables
###二、增长主机到集群 swarm clusters
docker swarm join --token SWMTKN-1-2yn0609winru1y5tsk00y9t54nh40thsvb7rjymfih5oz4ymy3-bgssyx8nlm0eiy0y4j8ugvsdh 172.16.100.20:2377
[docker@docker-2 ~]$ docker swarm join --token SWMTKN-1-2yn0609winru1y5tsk00y9t54nh40thsvb7rjymfih5oz4ymy3-bgssyx8nlm0eiy0y4j8ugvsdh 172.16.100.20:2377 This node joined a swarm as a worker.
docker node ls
[docker@docker-1 ~]$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION hzo1e9ux1qounpcdujyz10pks * docker-1 Ready Active Leader 18.09.0-ce-tp3 jr99plvxg9o8as269vq5o3gql docker-2 Ready Active 18.06.1-ce # 固然在非管理节点查看会提示:This node is not a swarm manager.
删除节点命令
docker node rm 节点ID
节点主机删除集群
docker swarm leave
(此方法不推荐,这个方法只是在管理显示节点是down的状态,并不能直接删除列表,还得采用上一个办法完全删除。)
强制删除集群
docker swarm leave --force
启动以前要在每一个节点开启一下端口:
7946 tcp/udp 用于容器网络的发现
4789 udp 用于容器入口发现
两个节点都运行:
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT iptables -A INPUT -p udp --dport 7946 -j ACCEPT iptables -A INPUT -p udp --dport 4789 -j ACCEPT iptables -A INPUT -p udp --dport 4000 -j ACCEPT service iptables save systemctl restart iptables # 4000 是步骤三里边指定的映射80端口
部署应用程序
[docker@docker-1 ~]$ docker stack deploy -c docker-compose.yml python-test-web Creating network python-test-web_webnet Creating service python-test-web_web
[docker@docker-1 ~]$ docker stack ps python-test-web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 49fw7nvy2qgp python-test-web_web.1 506554897/python-web-test:part1 docker-2 Running Preparing 22 seconds ago xie9q8h36bbo python-test-web_web.2 506554897/python-web-test:part1 docker-1 Running
注意:这时候运行的服务已经 负载均衡分布在了两个节点上。这时候能够随便访问两个节点的ip 的4000 端口了。
只须要参考第三部分 修改docker-compose.yml文件,而后从新运行docker stack deploy ...
命令再次部署更新更改的内容。
[docker@docker-1 ~]$ docker stack rm python-web Removing service python-web_web Removing network python-web_webnet
普通节点删除方式:docker swarm leave
管理节点删除方式:docker swarm leave --force
docker swarm init
docker swarm join --token SWMTKN-1-2yn0609winru1y5tsk00y9t54nh40thsvb7rjymfih5oz4ymy3-bgssyx8nlm0eiy0y4j8ugvsdh 172.16.100.20:2377
docker node ls
docker node inspect 节点id
docker stack deploy -c docker-compose.yml 应用程序名
docker stack ps 应用程序名
docker stack rm 应用程序名
普通节点删除方式:docker swarm leave
管理节点删除方式:docker swarm leave --force
这部分将学习应用程序层次结构的顶部:堆栈。堆栈是一组相互关联的服务,它们共享依赖关系,能够在一块儿进行编排和缩放。单个堆栈可以定义和协调整个应用程序的功能(尽管很是复杂的应用程序可能须要使用多个堆栈)。
从技术上讲,从第三部分开始,就一直在使用堆栈,咱们建立了一个docker-compose.yml文件并使用docker stack deploy
部署了应用程序。可是这是在当个主机上运行的当个服务堆栈,这一般不是生产环境中发生的状况。接下来咱们学习使多个服务相互关联,并在多台机器上运行它们。
可视化工具是一个独立的服务。能够在堆栈中的任意应用程序中运行。用可视化服务来查看应用程序部署状况。
替换如下内容,可是必定要更换username/repo:tag
,还有image细节。
version: "3" services: web: # replace username/repo:tag with your name and image details image: 506554897/python-web-test:part1 deploy: replicas: 5 restart_policy: condition: on-failure resources: limits: cpus: "0.1" memory: 50M ports: - "80:80" networks: - webnet visualizer: image: dockersamples/visualizer:stable ports: - "8080:8080" volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: [node.role == manager] networks: - webnet networks: webnet:
docker stack deploy
命令[docker@docker-1 ~]$ docker stack deploy -c docker-compose-visualizer.yml python-test-visualizer Creating network python-test-visualizer_webnet Creating service python-test-visualizer_web Creating service python-test-visualizer_visualizer
查看应用程序的端口:集群任意一个节点的ip便可访问
查看visualizer 映射的8080端口:访问管理节点ip 8080便可访问
constraints: [node.role == manager] 表明只部署到管理节点上。
同时也能够用命令查看应用程序在集群中的部署:
docker stack ps python-test-visualizer
中止删除应用:
docker stack rm python-test-visualizer
如今让咱们建立一个:提供访问者计数器的redis服务。
替换如下内容,可是必定要更换username/repo:tag
,还有image细节。最后添加了redis服务。
version: "3" services: web: # replace username/repo:tag with your name and image details image: 506554897/python-web-test:part1 deploy: replicas: 5 restart_policy: condition: on-failure resources: limits: cpus: "0.1" memory: 50M ports: - "80:80" networks: - webnet visualizer: image: dockersamples/visualizer:stable ports: - "8080:8080" volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: [node.role == manager] networks: - webnet redis: image: redis ports: - "6379:6379" volumes: - "/home/docker/data:/data" deploy: placement: constraints: [node.role == manager] command: redis-server --appendonly yes networks: - webnet networks: webnet:
注意:
以上配置文件中redis 只有名字,是由于redis在官网有一个官方形象,并得到了简单受权。 6379 :是redis预先配置端口 volumes:定义redis存放数据的地方 constraints:该部分限制redis服务部署在管理节点
redis使数据在此堆栈的部署之间持久化的规范:
redis老是在管理节点上运行,因此它老是使用相同的文件系统。 redis能够访问的主机文件系统的任意目录,此处是/home/docker/data目录。
这样规范部署能够确保两个部分:
redis服务设置了空间约束,能确保它始终使用相同的主机。 redis数据都保存在data目录下,从而保持数据连续性。
./data
目录mkdir ./data
docker stack deploy
命令[docker@docker-1 ~]$ docker stack deploy -c docker-compose-redis.yml python-test-redis Creating network python-test-redis_webnet Creating service python-test-redis_visualizer Creating service python-test-redis_redis Creating service python-test-redis_webdocker stack deploy -c docker-compose-redis.yml python-test-redis
docker service ls #查看是否运行有三个服务python-test-redis_redis visualizer web docker stack ps python-test-redis #查看应用程序部署的状况
固然web界面的 可视化也能够验证:
当不断访问管理节点主页,计数器也在不断变化:
注意:
这里的可视化服务和redis都只部署在了管理节点,固然也能够部署在其余节点,能够将deploy修改为和web相似的配置:
deploy: replicas: 2 restart_policy: condition: on-failure resources: limits: cpus: "0.1" memory: 50M
本文pdf版本连接:http://down.51cto.com/data/2451861 官网应用案例:https://docs.docker.com/samples/ docker 概况:https://docs.docker.com/engine/docker-overview/ 开发docker:https://docs.docker.com/develop/ 配置docker网络:https://docs.docker.com/network/ 管理docker应用数据:https://docs.docker.com/storage/ 在生产中运行app:https://docs.docker.com/config/labels-custom-metadata/ 标准和听从性:https://docs.docker.com/compliance/ 开源docker贡献:https://docs.docker.com/opensource/ docker档案文件:https://docs.docker.com/docsarchive/