ただただ初心者がdockerを使ってみるだけ

dockerの練習として
コンテナにapacheをインストールして、外部公開してみたい
dockerで使うコマンドは、限定公開記事にしてまとめてみる
https://qiita.com/koko_kotsu/private/ef2ec44cd220787c86e9

## 環境
* Oracle Linux 8.7
* CPU - Arm
* firewalld - disable
* locale - ja_JP.UTF-8
* timezone - Asia/Tokyo
* SELINUX - disable

## まずはDockerをインストール
ローカルPCではなくサーバにDockerをインストールすればきっと簡単に公開できるはずなので
サーバを立ててDockerをインストールする
インストール手順はこちらの記事を参考にしました。
https://zenn.dev/kyami/articles/15185192395cb7

dockerのリポジトリを取得
```
# dnf config-manager --add-repo=https://download.docker.com/linux/centos/d
ocker-ce.repo
```

dockerをインストール
```
# dnf install -y docker-ce --nobest
```

dockerを起動
```
# systemctl start docker
```

dockerの情報
とりあえず正常にインストールできたっぽい
```
# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.9.1-docker)

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 20.10.22
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: false
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 9ba4b250366a5ddde94bb7c9d1def331423aa323
 runc version: v1.1.4-0-g5fd4c4d
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 5.4.17-2136.314.6.3.el8uek.aarch64
 Operating System: Oracle Linux Server 8.7
 OSType: linux
 Architecture: aarch64
 CPUs: 2
 Total Memory: 6.998GiB
 Name: docker
 ID: U6TX:PPKV:DFCI:GXY5:ON4C:QHCV:NEYK:MJDW:F4JA:3UDA:UDQK:PA7A
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false
```

## Dockerfileを作ってみる
Dockerfileにある程度書き込んで、webを公開してみたい
Dockerfileについてはここを参考にしてみました。
https://masaki-blog.net/docker-apache-dockerfile

### dockerfileを作る
まずは、見よう見まねで作ってみる
```
[opc@docker ~]$ cat Dockerfile 
FROM httpd:2.4

RUN mkdir /usr/local/apache2/conf/include/ &&  echo 'Include conf/include/*.conf ' >> /usr/local/apache2/conf/httpd.conf

COPY ./conf/*.conf   /usr/local/apache2/conf/include/
```

### bulidしてみる

buildしてみたら、権限が足りなかった
```
[opc@docker ~]$ docker build -t test-apache ./
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&shmsize=0&t=test-apache&target=&ulimits=null&version=1": dial unix /var/run/docker.sock: connect: permission denied
```

rootユーザにスイッチして再度実行
```
[root@docker ~]# docker build -t test-apache ./
Sending build context to Docker daemon  10.24kB
Step 1/3 : FROM httpd:2.4
2.4: Pulling from library/httpd
4b7f5b2a3113: Pull complete 
fac45e5a15ef: Pull complete 
60db67158dbf: Pull complete 
b89f66e6e64a: Pull complete 
ef4f55b91ed7: Pull complete 
Digest: sha256:f8c7bdfa89fb4448c95856c6145359f67dd447134018247609e7a23e5c5ec03a
Status: Downloaded newer image for httpd:2.4
 ---> 6c064f9f5f14
Step 2/3 : RUN mkdir /usr/local/apache2/conf/include/ &&  echo 'Include conf/include/*.conf ' >> /usr/local/apache2/conf/httpd.conf
 ---> Running in f3b8734ab52b
Removing intermediate container f3b8734ab52b
 ---> 4f01924ecbb0
Step 3/3 : COPY ./conf/*.conf   /usr/local/apache2/conf/include/
COPY failed: no source files were specified
```

Dockerイメージができたっぽい
```
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
<none>       <none>    4f01924ecbb0   30 seconds ago   139MB
httpd        2.4       6c064f9f5f14   7 days ago       139MB
```

## コンテナを立ち上げてみる
`run`コマンドで立ち上げてみる！
何やらエラーが発生
[空き容量不足](https://qiita.com/hatobeam75/items/cb0a5d1b1e49a4da7fba)みたい。。。OCIのAlwaysFreeではダメなのか？
```
[root@docker ~]# docker run -dp 8001:80 httpd --name k-apache
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
Digest: sha256:f8c7bdfa89fb4448c95856c6145359f67dd447134018247609e7a23e5c5ec03a
Status: Downloaded newer image for httpd:latest
a64d57b028f45aa2093ad30b64f9be58db6c481f40e86de28aedd96ae7b7f197
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "--name": executable file not found in $PATH: unknown.
```

ルート領域の容量を追加して再トライ。
それでも上手くいかず。。。
```
/dev/mapper/ocivolume-root    36G  9.0G   27G   26% /
↓
/dev/mapper/ocivolume-root    89G  9.4G   80G   11% /

[root@docker ~]# docker run -dp 8001:80 httpd --name k-apache
f0fa0e554df3fd2b759c3db9344693c2b32a13fbd9b071be3ac04eef1f936d4e
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "--name": executable file not found in $PATH: unknown.
```

参考サイト様のコマンド通りに実行したら上手くいった
ただのオプションミスでした。
```
[root@docker ~]#  docker run -dit --name my-running-app -p 8080:80 httpd
97184d8da5b44c65b8cdbef6baf4e1e6f2054aeaef9ecbe7d317865b3a155c6d
```

やりたかったことはこう！
端折ることはしないで正確に書いてみると、動いた！
（容量不足は関係なかった）
```
[root@docker ~]# docker run --name k-apache -i -t -d -p 8080:80 httpd
abe0421a464f317909fa4ad9e27d162198ebddf40e18c3ad44c0558b6db6633e
```

ブラウザから接続してみると、とりあえず接続できてそう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/dc76e37d-dc52-6797-67da-7fdea86b3243.png)

## HelloWorldにしなければ
やっぱりとりあえず触る系といえばHelloworldなので、
それを出して終わりしたい。
index.htmlに書き込めばいいだけのはずなので、
Dockerfileに書く方法と直接書き込む方法の２種類を試す

### 直接書き込む
`exec`コマンドでコンテナに接続
```
[root@docker ~]# docker exec -it k-apache /bin/bash
root@abe0421a464f:/usr/local/apache2# 
```

viで書き込むだけ、と思ったらviがない
Ubuntu系っぽいので、vimをインストール
```
# apt-get update
# apt-get install vim
```

httpd.confからドキュメントルートを確認して
index.htmlを書き換え！
```
root@abe0421a464f:/usr/local/apache2/htdocs# pwd 
/usr/local/apache2/htdocs
root@abe0421a464f:/usr/local/apache2/htdocs# vim index.html 
root@abe0421a464f:/usr/local/apache2/htdocs# cat index.html 
<html><body><h1>HelloWorld</h1></body></html>
root@abe0421a464f:/usr/local/apache2/htdocs# 
```

完了！
こっちは書き換えるだけだから、簡単でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/3dc55da7-c9e9-e6a3-eca2-ee16e4a6fdda.png)

### Dockerfileをいじる
とりあえず見よう見まねで修正してみた
`RUN`がきっとコンテナ内でコマンド実行って意味だと思うのでたぶん合ってる
ついでにvimもインストールしておく
```
FROM httpd:2.4

RUN mkdir /usr/local/apache2/conf/include/ &&  echo 'Include conf/include/*.conf ' >> /usr/local/apache2/conf/httpd.conf

COPY ./conf/*.conf   /usr/local/apache2/conf/include/

RUN apt-get update && apt-get -y install vim

RUN mv /usr/local/apache2/htdocs/index.html /usr/local/apache2/htdocs/index.html_org && echo 'HelloWorld' > /usr/local/apache2/htdocs/index.html
```

新しくbuildする
しかし、エラーが発生。
初めのbuild時の内容もよくみてみたら失敗してた。３つ目のCOPYが上手くいってないみたい
```
[root@docker ~]# docker build -t helloworld-apache ./
Sending build context to Docker daemon   12.8kB
Step 1/5 : FROM httpd:2.4
 ---> 6c064f9f5f14
Step 2/5 : RUN mkdir /usr/local/apache2/conf/include/ &&  echo 'Include conf/include/*.conf ' >> /usr/local/apache2/conf/httpd.conf
 ---> Using cache
 ---> 4f01924ecbb0
Step 3/5 : COPY ./conf/*.conf   /usr/local/apache2/conf/include/
COPY failed: no source files were specified
```

よくよく調べてみたら`COPY`ってローカルPCからコンテナにファイルをコピーするためのコマンドでした。
見よう見まねでやったのがいけなかった。
なので余計なRUNもCOPYも削除して、bulidする。
```
FROM httpd:2.4

RUN apt-get update && apt-get -y install vim

RUN mv /usr/local/apache2/htdocs/index.html /usr/local/apache2/htdocs/index.html_org && echo 'HelloWorld' > /usr/local/apache2/htdocs/index.htm
```

imageができた！
```
[root@docker ~]# docker images
REPOSITORY          TAG       IMAGE ID       CREATED          SIZE
helloworld-apache   latest    d6a8916c3b5d   9 seconds ago    192MB
```

立ち上げる！
```
[root@docker ~]# docker run --name world -i -t -d -p 8081:80 world-apache-image
3f298b15ff32bbe8b9d43946a75a9bb4402dfe47090c7d12d2ee996d632b7ff3

```

見れた！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610268/88d18487-0ace-442f-75c8-839b4f42b76f.png)


## まとめ
何も考えずにドキュメントに書いてあることをそのままやると痛い目に合うということを見に染みて感じました。
参考サイトはあくまでも参考サイトということですね。
振り返ってみると大したことやってないのに、５時間近く経っていた。。。技術って楽しいけど難しいね。
次は、コンテナ間の通信とかに挑戦してみたい。