---
# System prepended metadata

title: 技術｜Docker 筆記
tags: [技術]

---

# Docker 筆記
- [dos2unix](http://askubuntu.com/questions/896860/usr-bin-env-python3-r-no-such-file-or-directory/)
- [APT Get Lock](https://askubuntu.com/questions/1109982/e-could-not-get-lock-var-lib-dpkg-lock-frontend-open-11-resource-temporari)

## 觀念
- 輕量型的 VM ，因為開發大型程式常會有套件版本不同問題，適合用 docker 來做區隔
- Container 是由 Image 所建立而來，是一個基於 Image 之上的可讀寫層
- 一個 Image 可以建立無限多個 Container
- 每個 Container 之前都是各別獨立的
## 執行別人寫好的 image 
- 下載映像檔
    - docker pull image
- 管理映像檔與容器
    - docker images
    - docker ps -a
    - docker rm container
    - docker rmi image
- 把映像檔用容器執行
    - docker run image
        - --name：替容器命別名
        - -it：讓標準輸入維持在打開的狀態，並配置一個虛擬的終端機
        - -d：讓容器進入背景執行
        - -p：綁定主機和容器的 port，host_port : container_port
        - -v：掛載目錄，host_volume : container_volume
        - –rm：結束時自動移除容器
- 操作容器
    - 開關
        - docker start container
        - docker stop container
    - 進入
        - docker start -ia container
        - docker attach container
        - docker exec -it container /bin/bash
    - 離開
        - Ctrl-p,  Ctrl-q：離開但不停止容器
        - exit (ctrl-D)
## DockerFile 製作 Docker Image
```dockerfile=
FROM        golang:1.20.1
RUN         mkdir -p /app
WORKDIR     /app
COPY        . .
RUN         go mod download
RUN         go build -o app
ENTRYPOINT  ["./app"]
```
## Docker Compose 範例
```dockerfile=
version: "3.9"

services:
  go-backend:
    image: go-backend
    ports:
      - "8888:8888"

  vue-frontend:
    image: vue-frontend
    ports:
      - "8080:8080"

  redis:
    image: redis
    ports:
      - "6379:6379"

  mongodb:
    image: mongo
    restart: always
    volumes:
      - ./mongodb_data:/data/db
    ports:
      - "27017:27017"

  mysqldb:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_DATABASE: mydatabase
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypassword
      MYSQL_ROOT_PASSWORD: myrootpassword
    ports:
      - "3306:3306"
    volumes:
      - ./mysql_data:/var/lib/mysql
```


## Reference
- [用30天來介紹和使用 Docker ](https://ithelp.ithome.com.tw/users/20103456/ironman/1320)
- [讓我們來玩玩Docker吧](https://ithelp.ithome.com.tw/users/20107537/ironman/1417)
- [Docker — 從入門到實踐](https://yeasy.gitbooks.io/docker_practice/image/build.html)
- [docker: permission denied](http://andy51002000.blogspot.com/2019/02/docker-permission-denied.html)
