---
# System prepended metadata

title: Docker 常用指令
tags: [dockerfile, yml, docker, docker-compose]

---

# Docker 常用指令
>[name=阿亮][time=Wed, Oct 2, 2024 6:05 PM]
###### tags: `docker`, `dockerfile`, `docker-compose`, `yml`

```gherkin=
docker ps -a                         //docker 列表
docker images                        //所有建立的映像檔
docker exec -it {docker id} bash     //執行進入某一個docker容器裡
docker rm {docker id}                //刪除 ps -a 裡的容器id
docker rmi {docker id}               //刪除 images 裡建立好的映像檔id
docker rmi -f {docker id}            //強制(force)刪除 images 裡建立好的映像檔id
```
docker id：是建立起容器後的 Hash id (雜湊編碼)
詳細說明：[Docker 初學筆記 - 基本指令操作教學](https://blog.longwin.com.tw/2017/01/docker-learn-initial-command-cheat-sheet-2017/)

# Docker compose 指令
```
docker compose ps -a               //查看列表
docker compose exec {容器名稱} bash //進入容器內
docker compose exec {容器名稱} sh   //進入容器內
docker compose up {容器名稱}        //啟用容器服務，顯示log現況
docker compose logs {容器名稱}      //查看容器記錄
```

---

# Docker使用

:::info
docker 要執行前，一定要存在著兩個檔案
 * dockerfile (環境建置參考檔)
 * yml (檔名可自定義)
:::

把這兩個檔案存在某個資料夾當中，開啟 命令提示字元 或是 Git Bash，路徑指到這資料夾後，執行
```gherkin=
docker compose up -d            //啟動docker服務並背景執行
docker compose down             //關閉docker服務
```

## Docker重建容器
```=
docker compose up -d --no-deps --build <service_name>
```

---

## dockerfile
> 將以下的指令，存成 dockerfile 檔名
```gherkin=
FROM php:7.2-apache

RUN apt update
RUN apt -y upgrade
RUN apt install -y apt-utils libldap2-dev curl zip git vim locales gettext make cmake gcc g++ doxygen python

RUN docker-php-ext-install pdo pdo_mysql bcmath ldap gettext

#setting language
RUN echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
RUN echo "zh_TW.UTF-8 UTF-8" >> /etc/locale.gen
RUN echo "zh_TW.BIG5" >> /etc/locale.gen
RUN echo "zh_CN.UTF-8 UTF-8" >> /etc/locale.gen
RUN locale-gen

# install GD
RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev \
    && docker-php-ext-install -j$(nproc) iconv \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd

#install Imagemagick & PHP Imagick ext
RUN apt-get update && apt-get install -y \
        libmagickwand-dev --no-install-recommends

RUN pecl install imagick && docker-php-ext-enable imagick

RUN a2enmod rewrite

RUN curl -s https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer

#set timezone
ENV TZ=Asia/Taipei
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

EXPOSE 80 443

WORKDIR /var/www/html

# start Apache2 on image start
CMD ["/usr/sbin/apache2ctl","-DFOREGROUND"]
```

---

## docker-compose.yml
> 將以下的描述，存成 docker-compose.yml
```gherkin=
version: '3'

services:

    db:
        image: mysql:8
        container_name: mysql8
        ports:
            - 890:3306
        environment:
            - MYSQL_ROOT_PASSWORD=0000
            - TZ=Asia/Taipei
        volumes:
            - ./mysql:/var/lib/mysql
        command: --default-authentication-plugin=mysql_native_password

    dev:
        build:
            context: .
            dockerfile: dockerfile
        container_name: dev
        working_dir: /var/www/html
        volumes:
            - ./test/:/var/www/html
            - ./php/php.ini:/usr/local/etc/php/conf.d/php.ini
            - ./php/opencc.ini:/etc/php/7.2/mods-available/opencc.ini
        ports:
            - 801:80
        environment:
            - TZ=Asia/Taipei
```

## 使用 Dockerfile
```
build:
    context: .
    dockerfile: dockerfile
```
當有許多的套件要安裝或是得到的例子是使用 `Dockerfile` 的方式來做，可以先執行
```
docker compose build
```
來確保你的 `Dockerfile` 沒有出錯
若直接使用
```
docker compose up -d {容器名稱}
```
是將會建立完畢後，直接執行背景運作，但是出錯的話有問題的話，就必須要 `docker compose down` 

也可以先透過 `docker compose logs {容器名稱}` 來查看現在發生的容器錯誤是什麼

## DB連線問題
```!
Severity: Warning

Message: mysqli::real_connect(): php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution

Filename: mysqli/mysqli_driver.php

Line Number: 211
```