欣迪

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]
https://www.yiibai.com/docker/container_prune.html

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:

https://docs.docker.com/compose/
https://docs.docker.com/engine/reference/commandline/compose/
https://github.com/dockersamples/example-voting-app

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

https://docs.docker.com/config/containers/resource_constraints/

可以運行在遠端的主機

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

訂閱 IT-Monk

訂閱最新文章的發布消息! 😚😚😚
Loading

作者介紹 - 欣迪

欣迪

從設計到寫程式,發現自己有追求前端技巧的自虐傾向。不斷的踩坑,再從坑裡爬出來,慢慢對攀岩有點心得。 目前在多間公司擔任網站設計顧問。 同時也是網站架設公司負責人。