DockerでC言語の環境構築を行う

## はじめに

こんにちは。
今回、私は「ふつうのLinuxプログラミング」を読む過程で、Ubuntu上でC言語が動作する環境をDockerで構築しました。この記事では、その時の備忘録を共有したいと思います。

:::note warn
初学者のため間違っている箇所がある可能性があります。
その際はご指摘いただけると嬉しいです。
:::


## 動作環境
ハードウェア: Mac M2
コンテナ:Docker
OS: Ubuntu 16.04(バージョンは書籍で指定していたバージョンを使用しました。)

 ## 手順
 **①DockerのUbuntuのイメージをpullする
 ②pullしたイメージを元に```docker　run```をしてコンテナを作成する。
 ※```docker run```する際にマウントの設定をする。
 ③作成したコンテナ内に入って、gccをインストールする**


 ## ①DockerのUbuntu16.04のイメージをpullする
公式のDockerイメージをダウンロードする。

 ```linux
 docker pull ubuntu:16.04
 ```

pullしてきたイメージを確認する。
 ```
 docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
ubuntu       16.04    0000000000     months ago        MB
 ```

## ②pullしたイメージを元に```docker　run```してコンテナを作成する
イメージを元にコンテナを作成する際、注意すべき点が2つあります。

**2-1 マウントの設定をする
2-2 マウントする際に絶対パスで指定する**

### 2-1 マウントの設定

コンテナ内で特定のディレクトリをボリュームとして扱いたい場合、docker runコマンドでマウントの設定をします。

```
docker run -v [ホストディレクトリの絶対パス]:[コンテナの絶対パス] [イメージ名] [コマンド]
```
例えば、```/Users/aaaaaaaa/example/linux_pro```をコンテナ内の/usr/src/myappにマウントするには、以下のように設定します。

```
docker run -v /Users/aaaaaaaa/example/linux_pro:/usr/src/myapp -it  ubuntu:16.04 /bin/bash
```

https://qiita.com/Yarimizu14/items/52f4859027165a805630

以下のように指定してもマウントが可能です。
※linux_proディレクトリにいることを前提としています。
```
docker run -v "$(pwd)":/usr/src/myapp -it ubuntu:16.04 /bin/bash
```

:::note warn
コンテナの絶対パスを指定する際に```usr/src```などと指定しているとエラーが出るので```/usr/src```と指定してするように気をつけてください。
:::


```:エラー
docker: invalid reference format: repository name must be lowercase.
```

https://qiita.com/KEINOS/items/4d8800b38aa6580b66f4

https://frazz.hatenablog.jp/entry/2021/04/07/232036



この設定により、以下の2つの効果があります。

**1.DockerのUbuntuコンテナ内でディレクトリが作成されると、ホストマシンの指定したディレクトリにも新しいディレクトリが作成されます。**

**2. ホストマシン上でマウントしたディレクトリ配下に新しいディレクトリを作ると、コンテナ内の同じ場所にも同じディレクトリが作成されます。**

詳しく説明します。
### 1.DockerのUbuntuコンテナ内でディレクトリが作成されると、ホストマシンの指定したディレクトリにも新しいディレクトリが作成される

```:起動中のコンテナIDの確認
docker container ls
# 出力例
# CONTAINER ID   IMAGE           COMMAND       CREATED             STATUS                
# ID             ubuntu:16.04   "/bin/bash"   About an hour ago   Up About an hour   
```

```:コンテナの中に移動
docker exec -it [containerID] /bin/bash
```

```:ディレクトリの作成
cd /usr/src/myapp
mkdir hello
```
これでDockerの```/usr/src/myapp/hello```ディレクトリができます。

<a href="https://gyazo.com/54e76fa665570b8b1e68fedcab0bf0c6"><img src="https://i.gyazo.com/54e76fa665570b8b1e68fedcab0bf0c6.png" alt="Image from Gyazo" width="1442"/></a>

また、ホストマシンでは```example/linux_pro/hello```ディレクトリができます。

<a href="https://gyazo.com/95d701bc1bc3c334b77219f19aeddc00"><img src="https://i.gyazo.com/95d701bc1bc3c334b77219f19aeddc00.png" alt="Image from Gyazo" width="636"/></a>


### 2. ホストマシン上でマウントしたディレクトリ配下に新しいディレクトリを作ると、コンテナ内の同じ場所にも同じディレクトリが作成される。

2について
ホストマシンで```example/linux_pro/file```を作ると、
Dockerでは```/usr/src/myapp/file```ができます。

### 2-2 ホストディレクトリは絶対パスで表す
```docker run```でコンテナを作成する際にマウントしたいディレクトリのパスを指定しますが、この際にルートディレクトリ(/)からの絶対パスで```ホストディレクトリの絶対パス```を指定するように気をつけてください。


https://qiita.com/Hoshito/items/08fa9d387a848bd94c07

https://qiita.com/eee_eee/items/3bfc9ba935b2ec1e85d0


## ③コンテナ内でgccをインストールする。
コンテナ内でgccをインストールする手順は以下の通りです。

**1. パッケージリストの更新**
インストールする際に```E: Unable to locate package build-essential```のようなエラーが出たため、まずはパッケージリストを更新します。
```
apt-get update
```

**2. gcc（build-essential）のインストール**
gccを含む開発ツールのインストールには、build-essentialパッケージを利用しました。

```
apt-get install build-essential
```
3. インストールの確認 
3. インストールされたgccのバージョンを確認します。

```
gcc -dumpversion
出力例：5.0.4
```

## 終わりに
ここまででhello.cファイルなどをコンテナ内でビルドする環境が完成しました。
ここまで読んでくださってありがとうございました。

## 参考

https://qiita.com/k-keita/items/9f0d3110085ef6277a48