EC2/AWS でDocker・Docker-compose ・Image・Container・Volume・Networkを実行してみます

Docker入門したばかりです、忘れないようにメモしていきます。

### EC2でdocker、docker-composeをインストールしていきます。

```
// docker
sudo yum update -y
sudo yum install -y docker
sudo service docker start
sudo usermod -a -G docker ec2-user

// docker compose
sudo curl -L "https://github.com/docker/compose/rel... -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```

### Image
コンテナの基になるやつ dockerコンテナを立ち上げる基になるのがdocker imageです。

```
// docker centos検索
docker search centos

// イメージ一覧
docker image ls

// Image IDでimage削除
sudo docker rmi [Image ID]
注意: imageのcontainerはランチ中なら、先にcontainerを削除することが必要です。

// プルimage
docker pull centos:7
```

### Container
imageから仮環境を設定します

```
// imageからcontainerを行う
docker run --privileged -d -p 80:80 [Image Name] /sbin/init

例：docker run --privileged -d -p 80:80 centos:7 /sbin/init

// container ID チェック
docker ps

// containerに入り 
docker exec -it [Container ID] /bin/bash 

// Apacheインストール
yum -y install httpd
systemctl status httpd
systemctl start httpd
systemctl enable httpd

echo "Hello World" > /var/www/html/index.html

// containerをexit
exit

```

### Docker Hub
docker hubというdockerの公式サイトからpull（ダウンロード）してくることもできるし、自分で作ることもできます。

```
// 他のデバイスのimage 作成
docker commit -m "Comment" -a "筆者"  [Container ID] [Image Name]
例：docker commit -m "Centos Project01" -a "Nguyen A" d452f1a1b69d project01:v1

// docker/hubにログイン
docker login

// docker hubにプッシュ
docker tag [local image] [origin image]
例：docker tag test/project01:v1 origin/test:v1

docker push [image名]
例：docker push origin/test:v1

// container動くチェック
sudo docker ps -a

// container状態
docker container ls -a

// containner削除
sudo docker rm [Container ID]

// container中止
docker container stop [Container ID]

// 再起動
docker container restart [Container ID]

// container一旦動きを止める
docker container pause  [Container ID]

// container動くに入れる
docker container attach [Container ID]


// 全container中止
docker stop $(docker ps -a -q)

// 全container削除
docker rm $(docker ps -a -q)

// 全image削除
docker rmi -f $(docker images -a -q)

```


### Dockerfile
Imageを作成するために、一覧操作をまとめるのはDocker fileです。

```
# イメージベース
FROM centos:7

# Author
MAINTAINER "test"

# Apache設定
RUN yum update -y
RUN yum install -y sudo
RUN yum install -y epel-release
RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum clean all
RUN yum -y install wget
RUN yum -y install httpd
RUN yum -y install --enablerepo=remi,remi-php71 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-pgsql
 
#　Dir設定
WORKDIR /var/www/html

#localから仮定に移動
ADD ./code /var/www/html

# start httpd
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

# 80 443 など
EXPOSE 80


2. Build image
docker build -t httpd_sample .

3. containerを作成、実行
docker run -d -p 80:80 httpd_sample
```


### Docker Compose
複数のコンテナから成るサービスを構築・実行する手順を自動的にし、管理を容易にする機能です。

```
# docker file
FROM centos:7
RUN yum -y update
RUN yum -y install httpd php
WORKDIR /var/www/html
ADD ./code /var/www/html
EXPOSE 80

# docker compose yml
version: '3'
services:
  web:
    build: .
    command: ["/usr/sbin/httpd", "-D", "FOREGROUND"]
    volumes:
      - ./code:/var/www/html
    ports:
      - "80:80"

# build image
docker-compose build

# run 
docker-compose up
docker-compose up -d (background制度)

# stop
docker-compose stop

# start
docker-compose start

# stop and delete container
docker-compose down
```

### Docker Volume, Networks

#### Volume
目的はcontainerを削除するとき、データを削除しないように作成します。

```
# docker volume create       作成
# docker volume inspect      詳細
# docker volume ls           一覧
# docker volume rm           削除
# docker volume prune        全部削除

例１
docker volume create project01_code
docker run --name project01 -p 8081:80 -v project01_code:/usr/local/apache2/htdocs -d httpd

例２
docker container run --name mysql -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 -d mysql:5.7

docker volume create pj01_data
docker container run --name mysql -v pj01_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 -d mysql:5.7

```


#### Networks
同じネットワーク場合は複数containerを接続できます。

```
# docker network create        作成
# docker network inspect       詳細
# docker network ls             一覧
# docker network rm            削除
# docker network prune         要らないネットワーク削除
# docker network connect       接続作成
# docker network disconnect    接続中止

例１

docker network create --subnet 192.168.1.0/24 network1

# 作成したネットワークに設定し、接続します
docker run -itd --name=container1  --network network1 busybox
docker run -itd --name=container2  --network network1 busybox

#接続チェック
docker attach container1
ping [container2 ip]

例２
# docker run --name mysql --network network1 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7
# docker run --name wordpress --network network1 -e WORDPRESS_DB_PASSWORD=my-secret-pw -p 8080:80 -d wordpress
```

***よく使うコマンド***

```
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi -f $(docker images -a -q)
```

ご覧いただき、有難うございました。
勘違いところがあれば、気軽にコメントをしてください。