Docker 的配置和使用

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                        # 停止當前編排中的所有容器


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章