Docker compose安裝部署創(chuàng)建自定義網(wǎng)絡(luò)使用舉例
一、簡(jiǎn)介
Docker-Compose項(xiàng)目是Docker官方的開源項(xiàng)目,負(fù)責(zé)實(shí)現(xiàn)對(duì)Docker容器集群的快速編排。
Docker-Compose將所管理的容器分為三層,分別是:工程(project),服務(wù)(service)以及容器(container)。
Docker-Compose運(yùn)行目錄下的所有文件(docker-compose.yml,extends文件或環(huán)境變量文件等)組成一個(gè)工程,若無特殊指定工程名即為當(dāng)前目錄名。
一個(gè)工程當(dāng)中可包含多個(gè)服務(wù),每個(gè)服務(wù)中定義了容器運(yùn)行的鏡像、參數(shù)、依賴。一個(gè)服務(wù)當(dāng)中可包括多個(gè)容器實(shí)例,Docker-Compose并沒有解決負(fù)載均衡的問題,因此需要借助其它工具實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及負(fù)載均衡,比如 Consul。
Docker-Compose的工程配置文件默認(rèn)為docker-compose.yml,可通過環(huán)境變量COMPOSE_FILE或-f參數(shù)自定義配置文件,其定義了多個(gè)有依賴關(guān)系的服務(wù)及每個(gè)服務(wù)運(yùn)行的容器。
使用一個(gè)Dockerfile模板文件,可以讓用戶很方便的定義一個(gè)單獨(dú)的應(yīng)用容器。
在工作中,經(jīng)常會(huì)碰到需要多個(gè)容器相互配合來完成某項(xiàng)任務(wù)的情況。例如要實(shí)現(xiàn)一個(gè)Web項(xiàng)目,除了Web服務(wù)容器本身,往往還需要再加上后端的數(shù)據(jù)庫服務(wù)容器,甚至還包括負(fù)載均衡容器等。
Compose允許用戶通過一個(gè)單獨(dú)的docker-compose.yml模板文件(YAML 格式)來定義一組相關(guān)聯(lián)的應(yīng)用容器為一個(gè)項(xiàng)目(project)。
Docker-Compose項(xiàng)目由Python編寫,調(diào)用Docker服務(wù)提供的API來對(duì)容器進(jìn)行管理。因此,只要所操作的平臺(tái)支持Docker API, 就可以在其上利用Compose來進(jìn)行編排管理。
二、安裝
Compose
支持 Linux、macOS、Windows 10 三大平臺(tái)。
Compose
可以通過 Python 的包管理工具 pip
進(jìn)行安裝,也可以直接下載編譯好的二進(jìn)制文件使用,甚至能夠直接在 Docker 容器中運(yùn)行。前兩種方式是傳統(tǒng)方式,適合本地環(huán)境下安裝使用;最后一種方式則不破壞系統(tǒng)環(huán)境,更適合云計(jì)算場(chǎng)景。
Docker for Mac
、Docker for Windows
自帶 docker-compose
二進(jìn)制文件,安裝 Docker 之后可以直接使用。運(yùn)行以下指令檢查是否安裝成功:
$ docker-compose --version ? docker-compose version 1.29.2, build b02f1306
Linux 系統(tǒng)請(qǐng)使用以下介紹的方法安裝。
軟件包方式安裝
以u(píng)buntu為例:
$ sudo apt install docker-compose
二進(jìn)制包
在 Linux 上的也安裝十分簡(jiǎn)單,從 官方 GitHub Release (opens new window) 處直接下載編譯好的二進(jìn)制文件即可。
例如,在 Linux 64 位系統(tǒng)上直接下載對(duì)應(yīng)的二進(jìn)制包, 這里下載的是1.29.2版本。大家根據(jù)情況更改這個(gè)版本。
$ sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose
PIP 安裝
這種方式是將 Compose 當(dāng)作一個(gè) Python 應(yīng)用來從 pip 源中安裝。
執(zhí)行安裝命令:
$ sudo pip install -U docker-compose
注意:x86_64
架構(gòu)的 Linux 建議按照上邊的方法下載二進(jìn)制包進(jìn)行安裝,如果您計(jì)算機(jī)的架構(gòu)是 ARM
(例如,樹莓派),再使用 pip
安裝。
卸載
如果是二進(jìn)制包方式安裝的,刪除二進(jìn)制文件即可。
$ sudo rm /usr/local/bin/docker-compose
如果是通過 pip
安裝的,則執(zhí)行如下命令即可刪除。
$ sudo pip uninstall docker-compose
三、創(chuàng)建自定義網(wǎng)絡(luò)
docker 容器的網(wǎng)絡(luò)通信方式有多種,但是自定義網(wǎng)絡(luò)最靈活,最有用,這里就只介紹自定義網(wǎng)絡(luò)
1. 創(chuàng)建自定義網(wǎng)絡(luò)
# 以橋接(bridge)方式,創(chuàng)建名稱為docker_net的網(wǎng)絡(luò) docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 docker_net
2. 查看網(wǎng)絡(luò)
docker network ls
3. 啟動(dòng)容器,連接到自定義網(wǎng)絡(luò)
3.1使用docker啟動(dòng)(以mysql為例)
# 運(yùn)行mysql5.7,連到docker_net 這個(gè)自定義網(wǎng)絡(luò) docker run -d -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 --net docker_net mysql:5.7
3.2使用docker-compose啟動(dòng),見:二、docker-compose
4. 查看容器網(wǎng)絡(luò)
# 還可以進(jìn)入容器,ping宿主機(jī)或者其他容器 docker inspect 容器id
需要將已創(chuàng)建好的容器,連到某網(wǎng)路,也可以用 docker network connect 容器name 自定義網(wǎng)絡(luò)name,如:
docker network connect mysql01 docker_net
四、使用docker-compose部署中間件
例:docker-compose -f docker-compose-mysql8.0.yml -p mysql8 up -d
-f:指定docker-compose.yml文件路徑
-p:項(xiàng)目名稱
-d:后臺(tái)啟動(dòng)
portainer
docker-compose -f docker-compose-portainer.yml -p portainer up -d
version: '3' services: portainer: image: registry.cn-hangzhou.aliyuncs.com/example/portainer:2.1.1 container_name: portainer # 容器名為'portainer' restart: always # 指定容器退出后的重啟策略為始終重啟 networks: docker_net: #服務(wù)在容器中ip(其他服務(wù)引用使用) ipv4_address: 172.22.16.2 volumes: # 數(shù)據(jù)卷掛載路徑設(shè)置,將本機(jī)目錄映射到容器目錄 - ~/docker/portainer/data:/data - ~/docker/portainer/Portainer-CN:/public # 漢化 environment: # 設(shè)置環(huán)境變量,相當(dāng)于docker run命令中的-e TZ: Asia/Shanghai LANG: en_US.UTF-8 ports: # 映射端口 - "9001:9000" networks: docker_net: external: name: docker_net
prometheus
version: "3" services: prometheus: image: registry.cn-hangzhou.aliyuncs.com/example/prometheus:2.30.0 container_name: prometheus networks: docker_net: ipv4_address: 172.22.16.120 volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml command: "--config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/prometheus" ports: - "9090:9090" depends_on: - exporter exporter: image: registry.cn-hangzhou.aliyuncs.com/example/node-exporter:1.2.2 container_name: prometheus_exporter ports: - "9100:9100" networks: docker_net: ipv4_address: 172.22.16.120 # 用于UI展示 # https://grafana.com/docs/grafana/latest/installation/docker grafana: image: registry.cn-hangzhou.aliyuncs.com/example/grafana:8.1.5 container_name: prometheus_grafana restart: unless-stopped ports: - "3000:3000" # volumes: # - "./prometheus/grafana/grafana-storage:/var/lib/grafana" # - "./prometheus/grafana/public:/usr/share/grafana/public" # 這里面可處理漢化包 可參考 https://github.com/WangHL0927/grafana-chinese # - "./prometheus/grafana/conf:/usr/share/grafana/conf" # - "./prometheus/grafana/log:/var/log/grafana" # - "/etc/localtime:/etc/localtime" environment: GF_EXPLORE_ENABLED: "true" GF_SECURITY_ADMIN_PASSWORD: "admin" GF_INSTALL_PLUGINS: "grafana-clock-panel,grafana-simple-json-datasource,alexanderzobnin-zabbix-app" # 持久化到mysql數(shù)據(jù)庫 GF_DATABASE_URL: "mysql://root:123456:3306/grafana" # TODO 修改 depends_on: - prometheus networks: docker_net: ipv4_address: 172.22.16.120 networks: docker_net: external: name: docker_net
mysql8
docker-compose -f docker-compose-mysql8.0.yml -p mysql8 up -d
version: '3' services: mysql: image: registry.cn-hangzhou.aliyuncs.com/example/mysql8:8.0.27 container_name: mysql8 # 容器名為'mysql8' command: # MySQL8的密碼驗(yàn)證方式默認(rèn)是 caching_sha2_password,但是很多的連接工具還不支持該方式 # 就需要手動(dòng)設(shè)置下mysql的密碼認(rèn)證方式為以前的 mysql_native_password 方式 --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci restart: unless-stopped networks: docker_net: #服務(wù)在容器中ip(其他服務(wù)引用使用) ipv4_address: 172.22.16.80 volumes: - ~/docker/mysql8/data:/var/lib/mysql - ~/docker/mysql8/conf:/etc/mysql/conf.d - ~/docker/mysql8/logs:/logs environment: # 設(shè)置環(huán)境變量,相當(dāng)于docker run命令中的-e TZ: Asia/Shanghai LANG: en_US.UTF-8 MYSQL_ROOT_PASSWORD: 123456 # 設(shè)置root用戶密碼 ports: # 映射端口 - "3306:3306" networks: docker_net: external: name: docker_net
錯(cuò)誤:mysql連接錯(cuò)誤 - is not allowed to connect to this my sql server
解決方案如下:
創(chuàng)建用戶(創(chuàng)建root用戶,可通過密碼123456從任何主機(jī)登錄)
create user 'root'@'%' identified by '123456';
授予用戶權(quán)限(授予該用戶所有權(quán)限)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
3.刷新權(quán)限
flush privileges;
完成上述操作后,出現(xiàn)如下錯(cuò)誤 authentication plugin ‘caching_sha2_password’ cannot be loaded
是mysql賬戶密碼加密規(guī)則問題,修改賬戶加密規(guī)則
#修改加密規(guī)則 ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #更新一下用戶的密碼 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
nacos
version: '3' services: nacos: image: registry.cn-hangzhou.aliyuncs.com/example/nacos:2.0.3 container_name: nacos # 容器名為'nacos' restart: unless-stopped # 指定容器退出后的重啟策略為始終重啟,但是不考慮在Docker守護(hù)進(jìn)程啟動(dòng)時(shí)就已經(jīng)停止了的容器 networks: docker_net: #服務(wù)在容器中ip(其他服務(wù)引用使用) ipv4_address: 172.22.16.100 volumes: # 數(shù)據(jù)卷掛載路徑設(shè)置,將本機(jī)目錄映射到容器目錄 - ~/docker/nacos/logs:/home/nacos/logs # mysql8版本以上才需要額外此配置信息 - ~/docker/nacos_mysql_2.0.3/plugins/mysql:/home/nacos/plugins/mysql environment: # 設(shè)置環(huán)境變量,相當(dāng)于docker run命令中的-e - "PREFER_HOST_MODE=ip" - "MODE=standalone" - "MYSQL_DATABASE_NUM=1" - "SPRING_DATASOURCE_PLATFORM=mysql" #容器中mysql服務(wù)的ip - "MYSQL_SERVICE_HOST= 172.22.16.80" - "MYSQL_SERVICE_DB_NAME=nacos" - "MYSQL_SERVICE_PORT=3306" - "MYSQL_SERVICE_USER=root" - "MYSQL_SERVICE_PASSWORD=123456" ports: # 映射端口 (Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2個(gè)端口:9848、9849) - "8848:8848" - "9848:9848" - "9849:9849" - "9555:9555" mem_limit: 1000m # 最大使用內(nèi)存 networks: docker_net: external: name: docker_net
nginx
version: '3' services: nginx: image: registry.cn-hangzhou.aliyuncs.com/example/nginx:1.21.1 # 鏡像`nginx:1.21.1` container_name: nginx # 容器名為'nginx' networks: docker_net: #服務(wù)在容器中ip(其他服務(wù)引用使用) ipv4_address: 172.22.16.105 restart: unless-stopped # 指定容器退出后的重啟策略為始終重啟,但是不考慮在Docker守護(hù)進(jìn)程啟動(dòng)時(shí)就已經(jīng)停止了的容器 volumes: # 數(shù)據(jù)卷掛載路徑設(shè)置,將本機(jī)目錄映射到容器目錄 - "/home/dubbo/nginx/conf/nginx.conf:/etc/nginx/nginx.conf" - "/home/dubbo/nginx/conf/conf.d/:/etc/nginx/conf.d/" - "/home/dubbo/nginx/html:/home/dubbo/nginx/html" - "/home/dubbo/nginx/log:/var/log/nginx" environment: # 設(shè)置環(huán)境變量,相當(dāng)于docker run命令中的-e TZ: Asia/Shanghai LANG: en_US.UTF-8 ports: # 映射端口 - "80:80" networks: docker_net: external: name: docker_net
配置文件信息:nginx.conf
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }
配置文件信息:conf.d/default.conf
server { listen 80; server_name localhost; client_max_body_size 100M; #前端項(xiàng)目1 location /web/ { root /home/dubbo/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; #解決刷新404 } location /api/ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods *; proxy_buffering off; proxy_redirect off; proxy_set_header Host $host:$server_port; proxy_set_header proxy_url "api"; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 60; proxy_send_timeout 120; proxy_read_timeout 120; proxy_pass http://1.15.240.63:6443/api/; } location /nacos/ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods *; proxy_buffering off; proxy_redirect off; proxy_set_header Host $host:$server_port; proxy_set_header proxy_url "api"; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 60; proxy_send_timeout 120; proxy_read_timeout 120; proxy_pass http://nacos:8848/nacos/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
前端配置例子:
volumes: # 數(shù)據(jù)卷掛載路徑設(shè)置,將本機(jī)目錄映射到容器目錄 - "/home/dubbo/nginx/html:/home/dubbo/nginx/html" 注意: 前端項(xiàng)目放在宿主機(jī)/home/dubbo/nginx/html下的html目錄下, nginx啟動(dòng)時(shí)會(huì)加載更新到docker容器中的/home/dubbo/nginx/html中,可以放多個(gè)項(xiàng)目。 #nginx中前端項(xiàng)目1示例 location /web/ { root /home/dubbo/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; #解決刷新404 }
前端打包:vue.config.js中module.exports = { 下
publicPath: '/web/',
outputDir: 'web',
assetsDir: 'static',
productionSourceMap: false,
前端打包:vue.config.js中publicPath配置 './'時(shí)使用第1種: nginx使用 第1種: assetsPublicPath: './' location / { root /home/dubbo/nginx/html; index index.html index.htm; } 前端打包:vue.config.js中publicPath配置 '/web/'時(shí)使用第2種或者第3種: nginx使用 第2種: assetsPublicPath: '/web/' location /web/ { root /home/dubbo/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; #解決刷新404 } 第3種: location /web/ { alias /home/dubbo/nginx/html/web; index index.html index.php index.htm; }
redis
version: '3' services: redis: image: registry.cn-hangzhou.aliyuncs.com/example/redis:6.0.8 # 鏡像'redis:6.0.8' container_name: redis # 容器名為'redis' networks: docker_net: #服務(wù)在容器中ip(其他服務(wù)引用使用) ipv4_address: 172.22.16.79 restart: unless-stopped # 指定容器退出后的重啟策略為始終重啟,但是不考慮在Docker守護(hù)進(jìn)程啟動(dòng)時(shí)就已經(jīng)停止了的容器 command: redis-server /etc/redis/redis.conf --requirepass 123456 --appendonly no # 啟動(dòng)redis服務(wù)并添加密碼為:123456,默認(rèn)不開啟redis-aof方式持久化配置 # command: redis-server --requirepass 123456 --appendonly yes # 啟動(dòng)redis服務(wù)并添加密碼為:123456,并開啟redis持久化配置 environment: # 設(shè)置環(huán)境變量,相當(dāng)于docker run命令中的-e TZ: Asia/Shanghai LANG: en_US.UTF-8 volumes: # 數(shù)據(jù)卷掛載路徑設(shè)置,將本機(jī)目錄映射到容器目錄 - "./redis/data:/data" - "./redis/config/redis.conf:/etc/redis/redis.conf" # `redis.conf`文件內(nèi)容`http://download.redis.io/redis-stable/redis.conf` ports: # 映射端口 - "6379:6379" networks: docker_net: external: name: docker_net
五、使用docker-compose部署服務(wù)項(xiàng)目
gateway-server
docker-compose -f docker-compose-gateway.yml -p oms-gateway up -d
version: "3" services: oms-gateway: ? ?# 指定容器名稱 ? container_name: oms-gateway ? networks: ? ? docker_net: ? ? ? ?#服務(wù)在容器中ip(其他服務(wù)引用使用) ? ? ? ipv4_address: 172.22.16.150 ? ?# 重啟機(jī)制 ? restart: always ? image: java:8 ? volumes: ? ? ?# 本地jar包路徑 ? ? - /home/dubbo/gateway/oms-gateway-1.0.0.jar:/oms-gateway-1.0.0.jar ? ? ?# 掛載日志 -v A:B ,A指宿主機(jī)位置,B指容器位置 ? ? - /usr/logs:/logs ? ? ?# 指定容器時(shí)間為宿主機(jī)時(shí)間 ? ? - /etc/localtime:/etc/localtime ? ?# 訪問端口 ? ports: ? ? - "6443:6443" ? environment: ? ? TZ: Asia/Shanghai ? ? LANG: en_US.UTF-8 ? ?#啟動(dòng)容器后執(zhí)行的命令 ? entrypoint: java -server -Xms256m -Xmx256m -jar -Dfile.encoding=utf-8 -Dspring.profiles.active=dev oms-gateway-1.0.0.jar networks: docker_net: ? external: ? ? name: docker_net
以上就是Docker compose安裝部署創(chuàng)建自定義網(wǎng)絡(luò)使用舉例的詳細(xì)內(nèi)容,更多關(guān)于Docker compose安裝部署的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
docker安裝jenkins的過程并配置jdk、node和maven
本文介紹了如何從拉取Jenkins鏡像開始,通過創(chuàng)建文件夾、準(zhǔn)備JDK、Maven和Node環(huán)境,修改settings.xml支持http協(xié)議,到建立Dockerfile進(jìn)行Jenkins鏡像的二次打包,同時(shí)涉及容器的運(yùn)行、Jenkins初始化設(shè)置、插件安裝和環(huán)境變量配置等步驟,幫助用戶成功部署并運(yùn)行Jenkins服務(wù)2024-10-10Docker部署Prometheus的實(shí)現(xiàn)示例
Prometheus是一款開源的監(jiān)控和告警工具,它可以收集系統(tǒng)的各種指標(biāo)數(shù)據(jù),如CPU使用率、內(nèi)存使用量等,本文主要介紹了Docker部署Prometheus的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-08-08使用Portainer部署Docker容器的項(xiàng)目實(shí)踐
這篇文章主要介紹了使用Portainer部署Docker容器的項(xiàng)目實(shí)踐,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04搭建docker內(nèi)網(wǎng)私服的方法(docker-registry with nginx&ssl on centos)
這篇文章主要介紹了搭建docker內(nèi)網(wǎng)私服的方法(docker-registry with nginx&ssl on centos),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05Docker鏡像的導(dǎo)入導(dǎo)出代碼實(shí)例
這篇文章主要介紹了Docker鏡像的導(dǎo)入導(dǎo)出代碼實(shí)例,本文實(shí)例講解的很透徹很明了,有需要的同學(xué)可以參考下2021-03-03Linux上使用docker啟動(dòng)redis并遠(yuǎn)程訪問的實(shí)現(xiàn)
這篇文章主要介紹了Linux上使用docker啟動(dòng)redis并遠(yuǎn)程訪問的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04