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/