Mac 版Docker 客戶端下載:
https://docs.docker.com/docker-for-mac/install/
安裝之後打開preference,增加鏡像源,這樣下載需要的鏡像時速度會很快,這裏裝的是清華鏡像源。
清華源鏈接:
https://mirrors.tuna.tsinghua.edu.cn
在Docker Engine中添加如下內容:
{
"registry-mirrors": [
"https://mirrors.tuna.tsinghua.edu.cn"
],
"debug": true,
"experimental": true
}
進入項目docker,啓動docker。
可以在終端查看docker包含的容器,有各種數據庫等。
在我們自己的項目中,運行時需要先啓動基礎數據服務 mysql、redis、rabbitmq 等容器,然後啓動項目代碼容器,最後啓動nginx容器做靜態資源的代理。
使用docker ps -a 命令:
morika@care docker % docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19b05ad84638 mysql:5.6 "docker-entrypoint.s…" 31 seconds ago Up 29 seconds 0.0.0.0:3308->3306/tcp pf_mysql_1
3e05edb89860 mysql "docker-entrypoint.s…" 33 minutes ago Exited (1) 33 minutes ago mystifying_newton
3d722e4dd6fd mysql "docker-entrypoint.s…" About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3307->3306/tcp bnc-mysql
b31675a41338 mysql "docker-entrypoint.s…" About an hour ago Exited (1) About an hour ago hungry_jennings
aa862bf1047a nginx:latest "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp web
7b3c60749318 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago happy_sammet
cad402b13e39 hello-world "/hello" 2 hours ago Exited (0) 2 hours ago sweet_keller
7becb19467df hello-world "/hello" 2 hours ago Exited (0) 2 hours ago stoic_ride
46c3ee4ba13a pf_app "python ./app.py --d…" 3 months ago Exited (1) 3 months ago pf_app_1
f5d4d3b53c84 mongo "docker-entrypoint.s…" 3 months ago Exited (255) 3 months ago 0.0.0.0:27018->27017/tcp f5d4d3b53c84_pf_mongo_1
a72bbebcbb96 redis:4.0-alpine "docker-entrypoint.s…" 3 months ago Exited (255) 3 months ago 0.0.0.0:6381->6379/tcp a72bbebcbb96_pf_redis_1
f1f0e3f011dc nginx:1.13-alpine "nginx -g 'daemon of…" 3 months ago Exited (255) 3 months ago 0.0.0.0:80->80/tcp pf_nginx_1
0aa94c626f98 pf_app "python ./app.py --d…" 4 months ago Exited (0) 4 months ago pf_app_run_a431cd592c38
93b4827601fe pf_app "python ./app.py --d…" 4 months ago Exited (1) 4 months ago pf_app_run_13c715a35836
79886b2b15a3 rabbitmq:3.6-alpine "docker-entrypoint.s…" 4 months ago Up 30 seconds 4369/tcp, 5671/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp pf_rabbitmq_1
e75aa861cda3 sg_app "python ./app.py --d…" 5 months ago Exited (1) 5 months ago sg_app_1
fe0a028234bd redis:4.0-alpine "docker-entrypoint.s…" 5 months ago Exited (255) 5 months ago 0.0.0.0:6380->6379/tcp sg_redis_1
3d6c51f390dd rabbitmq:3.6-alpine "docker-entrypoint.s…" 5 months ago Exited (255) 5 months ago 4369/tcp, 5671/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp sg_rabbitmq_1
eb3ef6d89d9d mysql:5.6 "docker-entrypoint.s…" 5 months ago Exited (255) 5 months ago 0.0.0.0:3307->3306/tcp sg_mysql_1
293ed94bce59 abaffb51bd40 "/bin/sh -c 'apk add…" 5 months ago Exited (1) 5 months ago jovial_bell
morika@care docker % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19b05ad84638 mysql:5.6 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:3308->3306/tcp pf_mysql_1
3d722e4dd6fd mysql "docker-entrypoint.s…" About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3307->3306/tcp bnc-mysql
aa862bf1047a nginx:latest "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp web
79886b2b15a3 rabbitmq:3.6-alpine "docker-entrypoint.s…" 4 months ago Up 4 minutes 4369/tcp, 5671/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp pf_rabbitmq_1
啓動docker:
morika@care docker % ls
app-only.yml conf docker-compose.yml
morika@care docker % docker-compose up app
如果某個數據庫未啓動:如mysql,選擇對應的names登錄:
morika@care docker % docker exec -it pf_mysql_1 bash
root@19b05ad84638:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.6.46 MySQL Community Server (GPL)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
mongo 數據庫的啓動與登錄:
morika@care Desktop % docker exec -it pf_mongo_1 bash
root@9325f4da89f1:/# mongo -u senguo_test -p
MongoDB shell version v4.0.18
Enter password:
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("c412562d-19c6-481b-8fdb-448442dcbbee") }
MongoDB server version: 4.0.18
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
2020-06-16T16:21:33.450+0800 I STORAGE [initandlisten]
2020-06-16T16:21:33.450+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2020-06-16T16:21:33.450+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).
The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.
To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
> use senguopf
switched to db senguopf
> db.createUser({user: "local", pwd: "loval", roles: [{role: "readWrite", db: "senguopf"}]})
Successfully added user: {
"user" : "local",
"roles" : [
{
"role" : "readWrite",
"db" : "senguopf"
}
]
}
> db.auth("local", "local")
Error: Authentication failed.
0
> db.auth("local", "loval")
1
>
使用docker compose啓動:
docker-compose up
注意事項:
1、進入項目根目錄下的 docker 目錄並執行 docker-compose up app 即可自動構建整個項目的環境並以默認端口運行項目。可通過瀏覽器訪問 127.0.0.1:[項目默認端口號] 測試運行情況。
2、可以執行 docker-compose up -d nginx 後臺啓動 nginx 容器,此時該項目可通過 80 端口訪問
3、可以執行 docker-compose exec [容器名] [命令]對正在運行的容器執行命令,例如:docker-compose exec app /bin/sh(進入app這個容器後執行/bin/sh開啓一個可交互終端)
4、docker的目錄結構:
Docker
├── .env // 默認環境配置文件,用於對 docker-compose 的運行環境做定義
├── docker-compose.yml // 默認容器編排配置文件,包含項目運行時需要的數據服務等所有依賴
├── app-only.yml // 僅運行app容器的編排配置文件,此時數據服務需自行配置
├── conf
│ ├── app
│ │ ├── Dockerfile // 構建項目鏡像的 Dockerfile 文件
│ │ └── requirements.txt // 構建項目鏡像時需要安裝的 python 包列表
│ └── nginx
│ └── nginx.conf // docker 容器中的 nginx 使用的配置
├── data // docker 容器中的數據庫數據目錄(該目錄不同步到 git)
│ ├── mysql
│ └── redis
└── logs // docker 容器中應用日誌目錄(該目錄不同步到 git)
└── nginx
5、docker compose 配置文件
version: '2' # 配置文件兼容版本
services: # 定義該容器編排中不同容器的配置
app: # 容器名稱,下面是app容器的詳細配置
build: ./conf/app # app容器使用./conf/app目錄下的Dockerfile來構建自定義鏡像
stdin_open: true
tty: true
ports: # 端口映射
- "8887:8887" # "宿主機端口:容器內端口",將容器內的8887端口映射到宿主機8887端口,這樣本機就可以通過127.0.0.1:8887訪問到容器內的8887端口上運行的應用
volumes: # 文件/目錄映射
- ../:/usr/src/pyDemo:rw # - 宿主機目錄:容器內目錄:讀寫權限,將容器內的/usr/src/pyDemo目錄映射到宿主機的../目錄(當前配置文件所在目錄的前一級目錄)
working_dir: /usr/src/pyDemo/pyDemo/admin # 環境目錄,所有命令都在/usr/src/pyDemo/pyDemo/admin這個目錄下執行
networks: # 加入的網絡,加入同名網絡的不同容器間可以通過容器名稱來相互訪問
- front-tier
- back-tier # app容器和下面的mysql容器,都加入了back-tier這個網絡,所以app中可以使用mysql:3306來連接數據庫
depends_on: # 容器依賴,app容器依賴mysql、redis、rabbitmq三個容器,所以在啓動app的時候,會先啓動其依賴的容器,以保證app容器可以正常訪問其依賴的容器中的服務
- mysql
- redis
- rabbitmq
command: python ./app.py --debug=1 # 容器啓動時默認執行的命令,這裏是以debug模式啓動項目,注意這裏默認在上面配置的working_dir目錄下運行
nginx: # 容器名稱,下面是nginx容器的詳細配置
image: nginx:1.13-alpine # nginx容器使用nginx:1.13-alpine鏡像,本地不存在時會自動從鏡像源拉取
ports:
- "80:80"
volumes:
- ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf:ro # - 將容器內的/etc/nginx/nginx.conf映射到宿主機的./conf/nginx/nginx.conf上,實現nginx容器使用本機存儲的配置文件
- ./logs/nginx/:/var/log/nginx:rw
- ../:/usr/src/pyDemo:rw
networks:
- front-tier
depends_on:
- app
mysql:
image: mysql:5.6
ports:
- "3307:3306" # "宿主機端口:容器內端口",將容器內的3306端口映射到宿主機3307端口,這樣本機可以直接通過3307端口連接容器內的mysql數據庫
volumes:
- ./data/mysql:/var/lib/mysql:rw # 容器內/var/lib/mysql是mysql數據庫的實際數據存儲目錄,映射到本機目錄,這樣mysql數據不會隨容器的停止而消失,下面的redis容器同理
environment: # 容器運行環境變量設置
MYSQL_ROOT_PASSWORD: "test123" # mysql數據庫root密碼設置爲test123
MYSQL_USER: "local" # mysql數據庫增加local用戶
MYSQL_PASSWORD: "py_mysql" # mysql數據庫local用戶密碼設置爲py_mysql
networks:
- back-tier
redis:
image: redis:4.0-alpine
ports:
- "6380:6379"
volumes:
- ./data/redis:/data:rw
networks:
- back-tier
rabbitmq:
image: rabbitmq:3.6-alpine
ports:
- "5673:5672"
networks:
- back-tier
networks: # 定義該容器編排中的網絡配置
front-tier:
back-tier:
6、docker常用命令
docker run [選項] [鏡像名] [命令] [命令參數...] # 創建一個新的容器並運行一個命令
選項:
-a stdin: # 指定標準輸入輸出內容類型,可選 STDIN/STDOUT/STDERR 三項
-d: # 後臺運行容器,並返回容器ID
-i: # 以交互模式運行容器,通常與 -t 同時使用
-t: # 爲容器重新分配一個僞輸入終端,通常與 -i 同時使用
--name="my-nginx": # 爲容器指定一個名稱
-h "hostname": # 指定容器的hostname
-e username="ritchie": # 設置環境變量
--link=[]: # 添加鏈接到另一個容器
--expose=[]: # 開放一個端口或一組端口
-p hostport:containerport: # 指定容器暴露的端口對應宿主機的端口
-P: # 暴露容器端口對應宿主機的隨機端口
-v: # 給容器掛載存儲卷,掛載到容器的某個目錄
docker start/stop/restart [容器名/容器ID] # 運行/停止/重啓某個容器
docker exec [容器名/容器ID] [命令] [命令參數...] # 在一個運行的容器中執行命令
docker logs [容器名/容器ID] # 查看容器的標準輸出
docker images # 查看所有本地鏡像
dodker ps # 查看所有運行中的容器
docker ps -a # 查看所有容器
docker rm [容器名/容器ID] # 刪除某個容器
docker rmi [鏡像名/鏡像ID] # 刪除某個本地鏡像
docker build [選項] [路徑] # 根據Dockerfile構建鏡像
docker port [容器名/容器ID] # 列出容器的端口映射
7、docker compose常用命令
docker-compose up # 使用當前目錄下的默認編排配置文件docker-compose.yml,運行其中定義的所有容器並將所有容器的輸出集中展示到當前shell
docker-compose up app # 使用當前目錄下的默認編排配置文件docker-compose.yml,但僅運行其中定義的app這個容器,其依賴容器會自動運行,但只有app容器的輸出會展示到當前shell
docker-compose up -d mysql redis rabbitmq # 使用當前目錄下的默認編排配置文件docker-compose.yml,後臺運行其中定義的mysql redis rabbitmq三個容器
docker-compose up -d nginx # 使用當前目錄下的默認編排配置文件docker-compose.yml,後臺運行其中定的nginx容器
docker-compose exec app /bin/sh # 對正在運行的app容器執行命令/bin/sh,執行後會得到app這個容器的交互shell
docker-compose -f app-only.yml up # 使用指定的編排配置文件app-only.yml來運行容器,該文件一般只運行app容器,其數據依賴等需要自行配置
# 開啓一個新的容器並執行一個命令,這裏開啓了一個app容器來運行celery隊列
docker-compose run \
--rm \
-w /usr/src/pyDemo/pyDemo/admin/handlers \
-e C_FORCE_ROOT=True \
app \
celery -A celery_barcode_query worker -Q barcode_query --loglevel=info
docker-compose ps # 查看當前編排中的容器狀態
docker-compose down # 停止當前編排中的所有容器