Docker
## 顯示版本 docker -v ## 詳細資料 docker info ## 查看空間佔用 docker system df docker system df -v
container
製作 container 但不執行
docker create <image_name>:<version>
執行一個 container
- -d 或 –detach : 在背景執行容器
- -p 或 –publish : 暴露容器的端口
- -v 或 –volume : 掛載本機目錄到容器
- -e 或 –env : 設置環境變量
- -it : 開啟互動式 terminal
- –network: –network [network_name] 歸屬於 network
- –restart=always : 每次開機會自動開啟
- –cups=[val] : 限制 cpu 的用量 例如 cocker run –cups=.5 ubuntu 可以限制不超過一半的 cpu
- –memory=[val] : 限制記憶體 cocker run –memory=100m ubuntu
docker run <image name> // 自訂名稱 docker run --name <name> <image_name or image_id>:<version> // 自訂 port docker run -p <local port>:<container port> <image name or id> // 加一個確認版本的指令 docker run python:3.6 cat /etc/*release* // 背景執行 + cammamd docker run -d <image_name> sleep 1000 // 環境變數 -e docker run --name blue-app -e APP_COLOR=blue -p 38282:8080 kodekloud/simple-webapp
容器之間連結
docker run --link <container_name>:<alias> <image_name> docker run --name phpmyadmin -d --link mysql -e PMA_HOST="mysql" -p 8080:80 phpmyadmin/phpmyadmin
連接到正在運行的容器的命令
docker attach <container_name>
運行中執行指令,不進入 container 的環境
docker exec -it mysql-db env
列出運行中的 container
docker ps
列出所有 container
docker ps -a
停止 container
docker stop <id or name> <id or name>...
檢查 container
docker inspect <id or name>
刪除 container
docker rm <id or name> <id or name>...
docker container prune 命令用于取出所有停止的容器 + 刪除。
docker container prune [OPTIONS]
images
列出所有 images
docker images
刪除 images
docker rmi <id or name>
下載 images
docker pull <name>:<version 預設是 latest>
刪除無用的 images
docker image prune -a
觀看建構過程
docker history <image_id or image_name>
volumes
docker volume create data_volume ## docker run -v [localname]:[image defalult val] [image]## 如果沒先建立 volume 也會自動建立 docker run -v data_volume:/var/lib/mysql mysql ## 綁定掛載: 使用絕對路徑建立 volume## 如果已經有資料將會自動套入 docker run -v /data/mysql:/var/lib/mysql mysql ## 老式寫法 docker run --mount type=bind,source=/data/mysql,target=/var/lib/mysql mysql
Dockerfile
FROM python:3.6 RUN pip install flask ## 拷貝本機 到 container COPY . /opt/ EXPOSE 8080 ## 執行位置 WORKDIR /opt ## 指令 但可帶變數 ENTRYPOINT ["python", "app.py"]
建立 imgage
docker build -t <image_name>:<tag> <path_to_dockerfile>
登入 docker hub
docker login
push 到 docker hub
docker push <image_name>:<tag>
Command vs Entrypoint
在 Dockerfile 裏面
CMD 會是 hardcode,不能帶變數
CMD sleep 5
使用 ENTRYPOINT 可帶變數
ENTRYPOINT ["sleep"]
指令輸入以下 執行 sleep 5
docker run <image_name>:<tag> 5
使用 ENTRYPOINT + CMD 可帶變數與預設值
ENTRYPOINT ["sleep"] CMD ["5"]
Docker compose
不需要特別加 links
image 也可以直接使用本地的 image
services: db: image: mysql:8.0.32 environment: - MYSQL_ROOT_PASSWORD=12qwaszx ports: - 3306:3306 volumes: - /mining-data mining-phpmyadmin: image: phpmyadmin:5.2.0-apache ports: - 80:80 environment: - UPLOAD_LIMIT=300M - PMA_HOST=db # links: # - db
install and run
會記錄狀態
docker-compose up
會消除已經建立好的 contaner
docker-compose down
further reference:
conpose file example: https://docs.docker.com/compose/compose-file/compose-file-v3/
Deploy Private Registry
## login dokcker login [SERVER] ## 建立本地的 image registry docker run -d --name registry -p 5000:5000 registry:2 ## 把現有的 image 加上 tag docker image tag my-image localhost:5000/my-image ## push docker push localhost:5000/my-image ## pull docker pull localhost:5000/my-image ## 使用本地 ip docker pull 192.168.56.100/my-image ## 檢查儲存的 registry curl -X GET localhost:5000/v2/_catalog
Docker Engine
可以運行在遠端的主機
docker -H=remote-docker-engine:2375 docker -H=10.123.21:2375 run nginx
docker Network
Default Netwrok
- Bridge : 用來當作 container 的對外 software bridge
- None
- host : 放在 webserver 上的 ip
做一個新的 network
docker network create <network_name> docker network disconnect <network_name> <container_name> ## create docker network connect <network_name> <container_name> ## example network create --driver bridge --subnet 182.18.0.1/24 --gateway 182.18.0.1 wp-mysql-network