Docker 小筆記
===
> ref:
> **官方安裝指南**
> https://docs.docker.com/engine/install/centos/
> https://docs.docker.com/compose/install/
---
## 執行階段
#### image
```
# 列出 image 清單
docker image ls
# 刪除 image
docker image rm [IMAGE ID]
# 刪除 <none> 標籤的 images
docker rmi $(docker images -f "dangling=true" -q)
# 刪除未使用的 images
docker image prune -f
```
#### 從image生成容器
```
# docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
```
> [參數說明](https://docs.docker.com/engine/reference/commandline/run/)
-d : 背景執行
-p : port forwarding
-v : volume 對映容器內的 image 資料
-e k=v : 傳參數給容器
--rm : docker stop 時自動刪除容器
--privileged : 容器有訪問主機所有設備的權限
--name : 設定 container 名稱
#### 容器
```
#列出 container
docker ps -a
#刪除指定
docker container rm [Container Id]
#刪除全部
docker container stop $(docker container ls -aq) && docker system prune –af --volumes
```
#### 看容器 log
```
docker logs [container name] --tail 50 -f --timestamps
```
#### 進入容器並執行
```
docker exec -it [Container ID or Name] sh
```
#### network
```
docker network ls
docker network inspect [NETWORK ID]
```
#### 背景執行
```
docker-compose -d
```
#### 刪除之前的容器、網路。
```
docker-compose -f docker-compose.yml down
```
#### 從容器內複製檔案到主機
```
docker cp [Container ID or Name]:"/src_path" "/dest_path"
```
#### cmd
```
// build、create、start
docker-compose up
// stop、rm
docker-comopse down
```
---
## windows 安裝
[說明](https://docs.microsoft.com/zh-tw/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package)
1. 下載並安裝 [https://hub.docker.com/editions/community/docker-ce-desktop-windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows)
2. 啟用功能
```
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
3. 將 WSL 2 設定為預設版本
```
wsl --set-default-version 2
```
---
## CentOS 安裝
#### 移除舊版本(option)
```
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
```
#### yum更新
```
yum update
```
#### 安裝需要的軟體
> yum-util 提供yum-config-manager功能
```
yum install -y yum-utils
```
#### 設置yum來源
```
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```
#### 安裝docker
```
yum install docker-ce docker-ce-cli containerd.io -y
```
#### 啟動並加入開機啟動
```
systemctl start docker; systemctl enable docker;
```
#### 安裝 docker-compose 並更新
```
sudo yum install epel-release -y &&\
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose &&\
sudo chmod +x /usr/local/bin/docker-compose &&\
docker-compose --version
```
---
## 移除
```
sudo rm /usr/local/bin/docker-compose
```
---
## 啟用 Docker RestAPI
[Docker RestAPI SPEC](https://docs.docker.com/engine/api/v1.41/)
如果是用 systemcel 啟動的話
```
vi /lib/systemd/system/docker.service
---
# 找到 ExecStart 這行, 並加入 -H=tcp://0.0.0.0:2375, 如下
ExecStart=/usr/bin/dockerd -H=fd:// -H=tcp://0.0.0.0:2375
---
# 重啟 docker
systemctl restart docker
```
---
## 私有倉庫 Docker Registry
#### 啟動
[官方image](https://hub.docker.com/_/registry) 已經更新到2.7.1版(但是hash與2相同??)
```
docker run -d -p 5000:5000 -v /home/user1/storage:/var/lib/registry --name registry registry:2
```
用 docker-compose 方式啟動
```
version: '3.3'
services:
# 管理registry的web介面
registry_web:
container_name: registry_web
restart: always
image: parabuzzle/craneoperator:latest
environment:
- "REGISTRY_HOST=service.cloudx.local"
- "REGISTRY_PORT=5000"
- "REGISTRY_PROTOCOL=http"
- "SSL_VERIFY=false"
- "ALLOW_REGISTRY_LOGIN=true"
- "REGISTRY_ALLOW_DELETE=true"
ports:
- 3000:80
registry:
# registry 本體
container_name: registry
restart: always
image: registry:2
environment:
- "REGISTRY_STORAGE_DELETE_ENABLED=true"
ports:
- 5000:5000
volumes:
# - ./config/config.yml:/etc/docker/registry/config.yml:ro
- ./data:/var/lib/registry
```
#### 使用
```
#對現有image打上tag
#e.g. docker tag webapi 35.222.101.178:5000/webpai
docker tag [local_image] [registry_host]/[server_image]
docker push [registry_host]/[server_image]
docker pull [registry_host]/[server_image]
```
push/pull 前需修改 docker 設定
> 出現下列錯誤的話
> Get [registry_host]/v2/: http: server gave HTTP response to HTTPS client
windows 用 docker desktop 設定後重啟 docker

或是修改設定檔案, 預設路徑 C:\Users\\%USERNAME%\\.docker\daemon.json
linux 預設沒有daemon.json 需要自己建立
```
vi /etc/docker/daemon.json
---
{
"insecure-registries": ["registry.cloudx.com.tw:8000"]
}
---
# 重啟 docker
systemctl restart docker
```
可使用 rest api 來查詢倉庫的 images
[官方文件](https://docs.docker.com/registry/spec/api/)
```
# Listing Repositories
GET /v2/_catalog
# Listing Image Tags
GET /v2/<name>/tags/list
```
---
## Portainer (Docker可視化管理工具)
> [官方安装说明](https://documentation.portainer.io/archive/1.23.2/deployment/)
```
docker run -d -p 9000:9000 -p 8000:8000 \
--name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock \
-v /var/portainer/data:/data portainer/portainer
```
要使用docker api來增加外部endpoint的話, 目標要先啟用 [docker restapi](#啟用-Docker-RestAPI)
---
## shipyard (Docker可視化管理工具)
[官方部屬教學](https://shipyard-project.com/deploy/)
> 很複雜, 建議直接走 docker-compose 的方式
```
vi /var/shipyard/docker-compose.yml
```
```
version: '2'
services:
rethinkdb:
container_name: shipyard-rethinkdb
image : rethinkdb
discovery:
container_name: shipyard-discovery
image : microbox/etcd
command : -name discovery
ports :
- 4001:4001
- 7001:7001
proxy:
container_name: shipyard-proxy
image : shipyard/docker-proxy:latest
ports :
- 2375:2375
volumes :
- /var/run/docker.sock:/var/run/docker.sock
swarm-manager:
container_name: shipyard-swarm-manager
image : swarm:latest
command : manage --host tcp://0.0.0.0:3375 etcd://discovery:4001
swarm-agent:
container_name: shipyard-swarm-agent
image : swarm:latest
command : join --addr proxy:2375 etcd://discovery:4001
controller:
container_name: shipyard-controller
image : shipyard/shipyard:latest
command : server -d tcp://swarm-manager:3375
links :
- rethinkdb
- swarm-manager
ports :
- 8080:8080
```
```
docker-compose up -d
```
> 預設帳密為 admin shipyard
---
### 建立一個base image
```
# FROM scratch
# FROM busybox
FROM alpine:latest
# 安裝壓縮及解壓縮
RUN apk add --no-cache --upgrade bash && \
apk add postgresql-libs libpq zip unzip tree
RUN mkdir app
COPY ./ ./app
RUN zip app.zip app/*
# 啟動時解壓縮並覆蓋目錄
CMD ["unzip", "-o", "app.zip"]
# 每10秒ping一次自己, 達到服務不中斷
# CMD ["ping", "-i", "10", "localhost"]
```