Docker 基本使用命令

前言

剛看別人使用 Docker 的時候有很多不解,爲什麼要用 Docker,Docker 怎麼用?Docker 配置爲什麼這麼難?爲什麼網絡訪問不通?等等因素阻礙了筆者學習 Docker?其實筆者也很笨,有很多思考不清晰的點。順便也分享下。

學時疑惑:

Q:我一套服務爲什麼不放在一個容器裏面(Java、MySQL、Nginx、Redis 等)?

A:因爲既要維護容器內網絡,又要維護端口等等之類的東西,Docker 就是爲了快速搭建環境而生的,而且 Docker 最好也是一個服務一個容器,這樣好打理。

Q:Docker 能放到生產環境嗎?

A:在公司沒有專門的運維團隊情況下,不建議使用 Docker 部署的環境作爲生產環境,因爲不僅僅要維護項目和中間件,Docker 或者 Kubernetes 出現問題後,還要解決這些問題,也就是還要解決 Docker 的問題。如果在沒有專門運維團隊的情況下,最好使用某裏雲的服務,例如 RDS,SLB 等,最起碼別人還會幫你維護你的數據庫和服務。

基本命令

下載鏡像

# 以Redis爲例子
docker pull redis

運行鏡像

docker run \
-d # 後臺運行
--name redis6 # 自定義名字
-p 6379:6379 # 端口映射
redis # 鏡像名稱
docker run -d --name redis6 -p 6379:6379 redis redis-server --appendonly yes --requirepass "123456" # 完整命令

進入容器

第一種(不推薦,當退出容器使用 exit 命令時,會停止這個容器):

docker attach 容器id

第二種:

docker exec -it 容器id /bin/bash

暫停容器

docker stop 容器id

啓動容器

docker start 容器id

查詢容器列表

docker ps -a # 查看所有容器
docker ps # 查看運行中的容器

run 和 start 的區別:

查看容器信息

docker inspect 容器id

掛載

掛載介紹

容器裏面的文件都是在容器內部,而跟你當前電腦是沒有關係的,如果刪除了容器怎麼辦?但是資料又想保存就像 MySQL 一樣,我只是換一臺電腦就要把整個容器複製過去,太麻煩了!所以需要把容器的文件跟當前主機文件作爲一個映射。

命令教程

參數 - v 宿主機路徑: 容器路徑

# 以MySQL爲例子
docker run -d --name mysql8 -p 3306:3306 -v /data/mysql8/config:/etc/mysql/conf.d -v /data/mysql8/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
# 以上的命令可以參考:https://hub.docker.com/_/mysql,裏面有詳細介紹

爲什麼要知道這麼多路徑或者參數

每個中間件或者一個數據庫容器,他可能需要有很多配置,例如密碼,持久化文件的路徑等等。那我們怎麼知道路徑是什麼:

網絡

容器之間怎麼進行通訊

容器雖然是能相互通訊的,但是容器每次重啓 ip 都跟上一次不一樣,所以這樣通訊會很複雜。

示範

# 先拉個CentOS鏡像下來
docker pull centos
# 創建個容器
docker run -d -it --name centos1 centos
docker run -d -it --name centos2 centos

docker inspect centos1_id

截取一些容器信息下來:

[
    {
        "NetworkSettings"{
            "Networks"{
                "bridge"{
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID""9e7ed6d29ca3474de04409833e39b7c7965c7c63d3a1f509886a7a998e4825f8",
                    "EndpointID""41230bf523fac8fa4933989d98baaaa7655fba5c5dadd14e63839ffe868ed3f8",
                    "Gateway""172.17.0.1",
                    "IPAddress""172.17.0.4",
                    "IPPrefixLen": 16,
                    "IPv6Gateway""",
                    "GlobalIPv6Address""",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress""02:42:ac:11:00:04",
                    "DriverOpts": null
                }
            }
        }
    }
]
docker inspect centos2_id
[
    {
        "NetworkSettings"{
            "Networks"{
                "bridge"{
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID""9e7ed6d29ca3474de04409833e39b7c7965c7c63d3a1f509886a7a998e4825f8",
                    "EndpointID""8ae77d46887c795983ee7a8fb96951d05e236b4ca4b4caa5d5964f892e18a476",
                    "Gateway""172.17.0.1",
                    "IPAddress""172.17.0.5",
                    "IPPrefixLen": 16,
                    "IPv6Gateway""",
                    "GlobalIPv6Address""",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress""02:42:ac:11:00:05",
                    "DriverOpts": null
                }
            }
        }
    }
]

解決問題

docker network create centos-network
docker run -d -it --network centos-network --name centos3 centos
docker run -d -it --network centos-network --name centos4 centos
docker exec -it centos3_id /bin/bash
ping centos4 
# 所以當創建了一個network後 容器都能加入到這個網絡裏面,很方便

這樣就可以解決每次容器重啓後 ip 不一致問題。

小結

其實在剛使用容器的時候會很麻煩:

原文鏈接:https://juejin.cn/post/6974427129748389902

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/WLaguDyXgXvZd4KdREdP3w