Docker容器服務(wù)編排利器詳解
一、使用Docker Compose必要性及定義
用容器運(yùn)行一個(gè)服務(wù),需要使用docker run
命令。但如果我要運(yùn)行多個(gè)服務(wù)呢?
假設(shè)我要運(yùn)行一個(gè)web服務(wù),還要運(yùn)行一個(gè)db服務(wù),那么是用一個(gè)容器運(yùn)行,還是用多個(gè)容器運(yùn)行呢?
一個(gè)容器運(yùn)行多個(gè)服務(wù)會(huì)造成鏡像的復(fù)雜度提高,docker傾向于一個(gè)容器運(yùn)行一個(gè)應(yīng)用。
那么復(fù)雜的架構(gòu)就會(huì)需要很多的容器,并且需要它們之間有關(guān)聯(lián)(容器之間的依賴和連接)就更復(fù)雜了。
這個(gè)復(fù)雜的問(wèn)題需要解決,這就涉及到了**容器編排**的問(wèn)題了。
- Compose
- 編排
- 是對(duì)多個(gè)容器進(jìn)行啟動(dòng)和管理的方法
- 例如:LNMT,先啟動(dòng)MySQL,再啟動(dòng)Tomcat,最后啟動(dòng)Nginx
- 服務(wù)架構(gòu)的演進(jìn)
- 單體服務(wù)架構(gòu)
- 分布式服務(wù)架構(gòu)
- 微服務(wù)架構(gòu)
- 超微服務(wù)架構(gòu)
- 容器編排工具
- docker machine
- 在虛擬機(jī)中部署docker容器引擎的工具
- docker compose
- 是一個(gè)用于定義和運(yùn)行多容器Docker的應(yīng)用程序工具
- docker swarm
- 是Docker Host主機(jī)批量管理及資源調(diào)度管理工具
- mesos+marathon
- mesos 對(duì)計(jì)算機(jī)計(jì)算資源進(jìn)行管理和調(diào)度
- marathon 服務(wù)發(fā)現(xiàn)及負(fù)載均衡的功能
- kubernetes
- google開(kāi)源的容器編排工具
二、Docker Compose應(yīng)用參考資料
網(wǎng)址 https://docs.docker.com/compose/
- yaml格式
三、Docker Compose應(yīng)用最佳實(shí)踐步驟
3.1 概念
- 工程(project)
- 服務(wù) (Service)
- 容器 (Container)
3.2 步驟
1.定義應(yīng)用的Dockerfile文件,為了anywhere進(jìn)行構(gòu)建。
2.使用docker-compose.yaml定義一套服務(wù),這套服務(wù)可以一起在一個(gè)隔離環(huán)境中運(yùn)行。
3.使用docker-compose up就可以啟動(dòng)整套服務(wù)。
四、Docker Compose安裝
# wget https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64
# mv docker-compose-linux-x86_64 /usr/bin/docker-compose
# chmod +x /usr/bin/docker-compose
# docker-compose version Docker Compose version v2.2.3
五、Docker Compose應(yīng)用案例
運(yùn)行Python語(yǔ)言開(kāi)發(fā)的網(wǎng)站
5.1 網(wǎng)站文件準(zhǔn)備
# mkdir flaskproject [root@localhost ~]# cd flaskproject/ [root@localhost flaskproject]#
[root@localhost flaskproject]# vim app.py [root@localhost flaskproject]# cat app.py import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times.\n'.format(count)
[root@localhost flaskproject]# vim requirements.txt [root@localhost flaskproject]# cat requirements.txt flask redis
5.2 Dockerfile文件準(zhǔn)備
[root@localhost flaskproject]# vim Dockerfile [root@localhost flaskproject]# cat Dockerfile FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . CMD ["flask", "run"]
5.3 Compose文件準(zhǔn)備
[root@localhost flaskproject]# vim docker-compose.yaml [root@localhost flaskproject]# cat docker-compose.yaml version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
5.4 使用docker-compose up啟動(dòng)容器
[root@localhost flaskproject]# ls app.py docker-compose.yaml Dockerfile requirements.txt
[root@localhost flaskproject]# docker-compose up
輸出: [+] Running 7/7 ? redis Pulled 15.8s ? 59bf1c3509f3 Pull complete 2.9s ? 719adce26c52 Pull complete 3.0s ? b8f35e378c31 Pull complete 5.8s ? d034517f789c Pull complete 6.5s ? 3772d4d76753 Pull complete 6.6s ? 211a7f52febb Pull complete 6.8s Sending build context to Docker daemon 714B Step 1/9 : FROM python:3.7-alpine 3.7-alpine: Pulling from library/python 59bf1c3509f3: Already exists 07a400e93df3: Already exists bdabb07397e1: Already exists cd0af01c7b70: Already exists d0f18e022200: Already exists Digest: sha256:5a776e3b5336827faf7a1c3a191b73b5b2eef4cdcfe8b94f59b79cb749a2b5d8 Status: Downloaded newer image for python:3.7-alpine ---> e72b511ad78e Step 2/9 : WORKDIR /code ---> Running in 2b9d07bef719 Removing intermediate container 2b9d07bef719 ---> 7d39e96fadf1 Step 3/9 : ENV FLASK_APP app.py ---> Running in 9bcb28bd632a Removing intermediate container 9bcb28bd632a ---> 79f656a616d5 Step 4/9 : ENV FLASK_RUN_HOST 0.0.0.0 ---> Running in 8470c2dbd6c2 Removing intermediate container 8470c2dbd6c2 ---> e212ba688fcd Step 5/9 : RUN apk add --no-cache gcc musl-dev linux-headers ---> Running in 6e9ca0766bc8 fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/main/x86_64/APKINDEX.tar.gz fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/community/x86_64/APKINDEX.tar.gz (1/13) Installing libgcc (10.3.1_git20211027-r0) (2/13) Installing libstdc++ (10.3.1_git20211027-r0) (3/13) Installing binutils (2.37-r3) (4/13) Installing libgomp (10.3.1_git20211027-r0) (5/13) Installing libatomic (10.3.1_git20211027-r0) (6/13) Installing libgphobos (10.3.1_git20211027-r0) (7/13) Installing gmp (6.2.1-r1) (8/13) Installing isl22 (0.22-r0) (9/13) Installing mpfr4 (4.1.0-r0) (10/13) Installing mpc1 (1.2.1-r0) (11/13) Installing gcc (10.3.1_git20211027-r0) (12/13) Installing linux-headers (5.10.41-r0) (13/13) Installing musl-dev (1.2.2-r7) Executing busybox-1.34.1-r3.trigger OK: 143 MiB in 49 packages Removing intermediate container 6e9ca0766bc8 ---> 273d4f04dfbc Step 6/9 : COPY requirements.txt requirements.txt ---> daf51c54e8ba Step 7/9 : RUN pip install -r requirements.txt ---> Running in 2aa2d30c5311 Collecting flask Downloading Flask-2.0.3-py3-none-any.whl (95 kB) Collecting redis Downloading redis-4.1.3-py3-none-any.whl (173 kB) Collecting Jinja2>=3.0 Downloading Jinja2-3.0.3-py3-none-any.whl (133 kB) Collecting itsdangerous>=2.0 Downloading itsdangerous-2.0.1-py3-none-any.whl (18 kB) Collecting click>=7.1.2 Downloading click-8.0.3-py3-none-any.whl (97 kB) Collecting Werkzeug>=2.0 Downloading Werkzeug-2.0.3-py3-none-any.whl (289 kB) Collecting deprecated>=1.2.3 Downloading Deprecated-1.2.13-py2.py3-none-any.whl (9.6 kB) Collecting packaging>=20.4 Downloading packaging-21.3-py3-none-any.whl (40 kB) Collecting importlib-metadata>=1.0 Downloading importlib_metadata-4.11.1-py3-none-any.whl (17 kB) Collecting wrapt<2,>=1.10 Downloading wrapt-1.13.3-cp37-cp37m-musllinux_1_1_x86_64.whl (78 kB) Collecting typing-extensions>=3.6.4 Downloading typing_extensions-4.1.1-py3-none-any.whl (26 kB) Collecting zipp>=0.5 Downloading zipp-3.7.0-py3-none-any.whl (5.3 kB) Collecting MarkupSafe>=2.0 Downloading MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl (30 kB) Collecting pyparsing!=3.0.5,>=2.0.2 Downloading pyparsing-3.0.7-py3-none-any.whl (98 kB) Installing collected packages: zipp, typing-extensions, wrapt, pyparsing, MarkupSafe, importlib-metadata, Werkzeug, packaging, Jinja2, itsdangerous, deprecated, click, redis, flask Successfully installed Jinja2-3.0.3 MarkupSafe-2.0.1 Werkzeug-2.0.3 click-8.0.3 deprecated-1.2.13 flask-2.0.3 importlib-metadata-4.11.1 itsdangerous-2.0.1 packaging-21.3 pyparsing-3.0.7 redis-4.1.3 typing-extensions-4.1.1 wrapt-1.13.3 zipp-3.7.0 WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv WARNING: You are using pip version 21.2.4; however, version 22.0.3 is available. You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command. Removing intermediate container 2aa2d30c5311 ---> dd8f52b132f8 Step 8/9 : COPY . . ---> b36938a26cf5 Step 9/9 : CMD ["flask", "run"] ---> Running in 260cbfa02959 Removing intermediate container 260cbfa02959 ---> fa04dfec6ff2 Successfully built fa04dfec6ff2 Successfully tagged flaskproject_web:latest Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them [+] Running 3/3 ? Network flaskproject_default Created 0.1s ? Container flaskproject-redis-1 Created 0.1s ? Container flaskproject-web-1 Created 0.1s Attaching to flaskproject-redis-1, flaskproject-web-1 flaskproject-redis-1 | 1:C 15 Feb 2022 14:14:21.696 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo flaskproject-redis-1 | 1:C 15 Feb 2022 14:14:21.696 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started flaskproject-redis-1 | 1:C 15 Feb 2022 14:14:21.696 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf flaskproject-redis-1 | 1:M 15 Feb 2022 14:14:21.697 * monotonic clock: POSIX clock_gettime flaskproject-redis-1 | 1:M 15 Feb 2022 14:14:21.698 * Running mode=standalone, port=6379. flaskproject-redis-1 | 1:M 15 Feb 2022 14:14:21.698 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. flaskproject-redis-1 | 1:M 15 Feb 2022 14:14:21.698 # Server initialized flaskproject-redis-1 | 1:M 15 Feb 2022 14:14:21.698 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. flaskproject-redis-1 | 1:M 15 Feb 2022 14:14:21.698 * Ready to accept connections flaskproject-web-1 | * Serving Flask app 'app.py' (lazy loading) flaskproject-web-1 | * Environment: production flaskproject-web-1 | WARNING: This is a development server. Do not use it in a production deployment. flaskproject-web-1 | Use a production WSGI server instead. flaskproject-web-1 | * Debug mode: off flaskproject-web-1 | * Running on all addresses. flaskproject-web-1 | WARNING: This is a development server. Do not use it in a production deployment. flaskproject-web-1 | * Running on http://172.18.0.2:5000/ (Press CTRL+C to quit)
5.5 訪問(wèn)
到此這篇關(guān)于Docker容器服務(wù)編排利器的文章就介紹到這了,更多相關(guān)Docker容器編排內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker配置阿里云鏡像倉(cāng)庫(kù)的實(shí)現(xiàn)
本文主要介紹了docker配置阿里云鏡像倉(cāng)庫(kù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08解決docker pull鏡像報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了解決docker pull鏡像報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Docker部署Mysql,.Net6,Sqlserver等容器
這篇文章介紹了Docker部署Mysql,.Net6,Sqlserver等容器的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12如何解決IDEA無(wú)法連接docker中的數(shù)據(jù)庫(kù)的問(wèn)題
這篇文章主要介紹了如何解決IDEA無(wú)法連接docker中的數(shù)據(jù)庫(kù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06部署維護(hù)docker環(huán)境的詳細(xì)教程
這篇文章主要介紹了部署維護(hù)docker環(huán)境的詳細(xì)教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02解析Docker 下拉取oracle 11g鏡像配置的問(wèn)題
這篇文章主要介紹了Docker 下拉取oracle 11g鏡像配置的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09