【Docker】コンテナ環境を保存し別のサーバにデプロイし直す方法

Dockerを使って開発を行っていると、コンテナ内で作業した内容を他の環境にデプロイしたい場合があります。例えば、あるコンテナで作業したアプリケーションや設定をそのまま別の環境に移動させる必要がある場合です。今回は、Dockerコンテナの状態を保存し、別のサーバにコンテナをデプロイし直す方法について解説します。

## 目次

1. [コンテナを作成する](#1-コンテナを作成する)
2. [コンテナの状態を保存する](#2-コンテナの状態を保存する)
3. [保存したイメージをサーバ内で再デプロイする](#3-保存したイメージをサーバ内で再デプロイする)
4. [別の環境にデプロイする](#4-別の環境にデプロイする)
5. [まとめ](#5-まとめ)

---

## 1. コンテナを作成する

まず、DockerFileを用意します。

```bash
# M1 MacのみFROMの記述が必要
FROM --platform=linux/amd64 ubuntu:latest

# RUNコマンドは、コンテナ作成時に自動で実行するコマンドを指定
RUN apt update -y
RUN apt install -y sudo make curl vim iperf3 iproute2 iputils-ping

# fogeというユーザを作成、fogefogeというPWを設定
RUN useradd -m -s /bin/bash foge
RUN echo "foge:fogefoge" | chpasswd

# sudoでroot権限のコマンドを実行できるように指定
RUN gpasswd -a foge sudo

# コンテナを指定したユーザで実行（rootユーザ以外で実行したい）
USER foge

# ワークディレクトリを設定
WORKDIR /home/foge
```


DockerFileのあるディレクトリで以下のようにイメージを作成します。

```bash
docker build . -t ubuntu_image
```
イメージから`my-ubuntu`という名前でコンテナを作成します。

```bash
docker run -it -d --name my-ubuntu ubuntu_image
```

以下のコマンドでコンテナ環境に入ります。

```bash
docker exec -it my-ubuntu bash
```
インストールされているパッケージのリストを確認します。

```bash
sudo apt list --installed
```

現在のコンテナ環境を別のサーバに再デプロイした際、上記のパッケージリストが同一である事を確認し、コンテナ環境の移行が成功したかどうか検証していきます。

---

## 2. コンテナの状態を保存する

それでは、コンテナ環境の移行をしてみます。

### 2.1. Dockerイメージとして保存


`docker commit`コマンドを使用して、コンテナの状態をイメージとして保存します。

   ```bash
   docker commit my-ubuntu my_saved_image:latest
   ```

   これで、`my-ubuntu`コンテナの状態が`my_saved_image`という名前のDockerイメージとして保存されます。

保存されたイメージを確認するには、以下のコマンドを使います。

   ```bash
   docker images
   ```

   出力例：

   ```bash
   REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
   my_saved_image      latest    abcdef123456   1 minute ago    200MB
   ```

   これで、保存したイメージが確認できるはずです。

### 2.2. イメージにタグを付ける

もし保存したイメージを特定のバージョンとして管理したい場合、タグを付けることができます。例えば、`v1`というタグを付ける場合は以下のコマンドを使用します。

```bash
docker tag my_saved_image:latest my_saved_image:v1
```

---

## 3. 保存したイメージをサーバ内で再デプロイする

保存したイメージを使って新しいコンテナを作成します。

   ```bash
   docker run -it -d --name my-new-ubuntu my_saved_image:latest
   ```

   以下のコマンドでコンテナ環境に入ります。

   ```bash
   docker exec -it my-new-ubuntu bash
   ```

   インストールされているパッケージのリストを確認します。
   最初に作ったコンテナと同一のパッケージがインストールされている事を確認しましょう。

   ```bash
   sudo apt list --installed
   ```

---

## 4. 別の環境にデプロイする

次に、保存したイメージを別の環境にデプロイする方法を見ていきます。

### 4.1. イメージの保存と転送

##### 1. 保存したイメージをファイルとしてエクスポートするには、`docker save`コマンドを使用します。

   ```bash
   docker save -o my_saved_image.tar my_saved_image:latest
   ```

##### 2. エクスポートした`my_saved_image.tar`ファイルを別のサーバに転送します。例えば、`scp`を使ってファイルを転送できます。

   ```bash
   scp my_saved_image.tar user@remote-server:/path/to/destination
   ```

##### 3. 別の環境に転送したら、`docker load`コマンドを使ってイメージをインポートします。

   ```bash
   docker load -i /path/to/destination/my_saved_image.tar
   ```

### 4.2. 別の環境でコンテナを起動

イメージをインポートしたら、あとは通常通りコンテナを起動します。

   ```bash
   docker run -it -d --name my-new-container my_saved_image:latest
   ```

   以下のコマンドでコンテナ環境に入ります。

   ```bash
   docker exec -it my-new-container bash
   ```

   インストールされているパッケージのリストを確認します。
   最初に作ったコンテナと同一のパッケージがインストールされている事を確認しましょう。

   ```bash
   sudo apt list --installed
   ```



---

## 5. まとめ

Dockerコンテナの環境を保存し、別のコンテナとしてデプロイし直す手順を紹介しました。具体的には、以下の流れになります。

1. コンテナの状態を`docker commit`で保存
2. 保存したイメージを使って新しいコンテナを起動
3. 必要に応じて、`docker save`と`docker load`を使って異なる環境にイメージを移行

この方法を使うことで、異なる環境間で同じ作業環境を再現することができ、デプロイ作業を効率化できます。是非、試してみてください。