DockerのインストールとDockerFile

###■初めに

■Dockerfileを使用してコンテナにJenkinsをインストールとSSH接続（SSHクライアントより）本記事では、Azure仮想マシンにDockerをインストールし、JenkinsのインストールとSSH接続可能にしたDockerファイルからコンテナを起動させるところまでを行います

　最終的にはJenkinsからAnsibleを実行しAzureVMの作成を行います。

■予定
　<Font Color="Red">
　V1　：　Dockerインストール,Dockerfile（Jenkins）作成からイメージ起動,コンテナへの直接SSH
　</font>
　V2 　：　Ansibleイメージ起動,コンテナ間のSSH設定,Ansibleの稼働確認
　URL　：　[DockerコンテナでAnsible実行](https://qiita.com/yo_dazy/private/b5ed1fa1bb816b1de560)

　V3 　：　Jenkins設定（JenkinsでのSSH接続）、リモートホストへのジョブ実行
　URL　：　[Jenkinsでコンテナ間接続とジョブ実行](https://qiita.com/yo_dazy/private/34f9f5986155d2044b45)

　V4 　：　AnsiblePlaybook（AZVMと関連リソースの作成）、稼働確認(Jenkinsからの実行)
　URL　：　[Ansibleでクラウド構築(Azure)](https://qiita.com/yo_dazy/private/2cd34b7a07b114b77fcb)

---

###■イメージ

![DOC01.png](https://qiita-image-store.s3.amazonaws.com/0/150678/cb6184bc-a716-bc93-2799-28794ecab374.png)



■環境
-AzureVM
　host   : VMDO001
　OSType : CentOS 7.3
　Size   : Standard D2s v3
-NSG
　SSH (Any/Any) Accept
　7033 (Any/Any) Accept　※後述するコンテナとホストのポートバインドで使用
　8033 (Any/Any) Accept　※後述するコンテナとホストのポートバインドで使用

■やること
　【1】Docker-IO(Docker-ce)インストール
　【2】Dockerfileによるコンテナ起動
　【3】コンテナへのSSHクライアントログイン
　【4】コンテナ起動確認(Jenkinsコンテナ)

##■手順
####【1】Docker-IO(Docker-ce)インストール
　（１）．AzureVMの作成
※以下の環境でPowerCLI2.0で作成

```Ruby:AzureCLI

#VNET
az network vnet create --name "VN01" --resource-group "RG01" --location "japaneast" --address-prefix "10.10.0.0/16" --subnet-name "SN01" --subnet-prefix "10.10.1.0/24"
#NSG
az network nsg create --resource-group "RG01" --name "NSG01" --location "japaneast"
#NSG Rule
az network nsg rule create --resource-group "RG01" --nsg-name "NSG01" --name "CON-SSH-ALLOW" --description "SSHCON" --access "Allow" --protocol "Tcp" --direction "Inbound" --priority "1001" --source-address-prefix * --source-port-range * --destination-address-prefix * --destination-port-range "7033"
az network nsg rule create --resource-group "RG01" --nsg-name "NSG01" --name "CON-JEN-ALLOW" --description "JENCON" --access "Allow" --protocol "Tcp" --direction "Inbound" --priority "1002" --source-address-prefix * --source-port-range * --destination-address-prefix * --destination-port-range "8033"

#subnet
az network vnet subnet update --vnet-name "VN01" --name "SN01" --resource-group "RG01" --network-security-group "NSG01"

#VM
az vm create --resource-group "RG01" --name "VMDO001" --location "japaneast" --admin-username "hoge" --admin-password "naisyonopass" --size "Standard_D2s_v3" --vnet-name "VN01" --subnet "SN01" --image "CentOS" --public-ip-address "VMDO01" --nsg ""
```

　（２）．作成したVMにログイン
　（３）．VMDO001に｢Docker-io｣をインストール

```Ruby:コマンド(root)
yum -y install docker-io
```

注意：Docker-ioでもインストールは可能ですがパッケージ自身が古いようです
2018/11/20現在は[Docker-io]ではなく[Docker-ce]を入れるのが推奨らしい

```Ruby:コマンド(root)
# 前提パッケージインストール
yum install -y yum-utils device-mapper-persistent-data lvm2
# リポジトリ追加
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# パッケージインデックスを更新
yum makecache fast
# docker-ce インストール
yum install -y docker-ce
# dockerバージョンチェック（導入確認）
docker -v
```


　（４）．サービス関連(再起動時起動)

```Ruby:コマンド(root)
systemctl enable docker.service
```

　（５）．サービス関連(起動)

```Ruby:コマンド(root)
systemctl start docker.service
```
　（６）．DockerImageのPull

```Ruby:コマンド(root)
docker pull centos
```
　（７）．Docker imageを起動

```Ruby:コマンド(root)
docker run -i -t centos /bin/bash
```
　（８）．Docker プロセスの終了

```Ruby:コマンド(root)
exit
```

####【2】Dockerfileによるコンテナ起動
---

目的:イメージファイルを作りビルドする

~DockerFile内容~
カスタマイズ１：[ifconfig]等を使用可能に
カスタマイズ２：Jenkinsをインストール
カスタマイズ３：SSHをインストール
カスタマイズ４：[sshd_config]の編集
カスタマイズ５：[root]パスワード設定


　（１）．AzureVMにログイン
　（２）．Dockerfileの格納ディレクトリの作成

```ruby:コマンド(root)
mkdir /doc.file
vi /doc.file/dockerfile
```

```ruby:dockerfile
# Used CentOS
FROM centos
# SSH PKG Install
RUN yum install -y passwd
RUN yum install -y openssh
RUN yum install -y openssh-server
RUN yum install -y openssh-clients

# Jenkins PKG Install 1
RUN yum -y install epel-release
RUN yum -y install net-tools
RUN yum -y install initscripts
RUN yum -y install java

# Jenkins Repogistory
RUN echo "[jenkins]" >> /etc/yum.repos.d/jenkins.repo
RUN echo "name=Jenkins" >> /etc/yum.repos.d/jenkins.repo
RUN echo "baseurl=http://pkg.jenkins.io/redhat" >> /etc/yum.repos.d/jenkins.repo
RUN echo "gpgcheck=1" >> /etc/yum.repos.d/jenkins.repo

# Jenkins PKG Install 2
RUN rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
RUN yum -y install jenkins

# root password
RUN echo p@ssw0rd | passwd --stdin root

# sshd_config edit
RUN sed -ri "s/#PermitRootLogin yes/PermitRootLogin yes/g" /etc/ssh/sshd_config
```

　（３）．作成したファイルをビルドしてイメージに変換

```ruby:コマンド(root)
docker images
docker build -t centos/jenkinsbuild .
docker images
```

```ruby:実行結果
[root@hoge-c01 doc.file]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos      latest              ff426288ea90        6 weeks ago         207.2 MB
[root@hoge-c01 doc.file]# docker build -t centos/jenkinsbuild .
Sending build context to Docker daemon  2.56 kB
Step 1 : FROM centos:7
<…>
Successfully built efe713566224
[root@hoge-c01 doc.file]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
centos/jenkinsbuild   latest                   efe713566224        23 minutes ago      730.6 MB
docker.io/centos      latest              ff426288ea90        6 weeks ago         207.2 MB
```

　（４）．作成したImageをポートバインドして起動させる

```ruby:コマンド(root)
docker run -p 8033:8080 -p 7033:22 -itd --privileged centos/jenkinsbuild /sbin/init
```

補足)
ポートバインドさせるためには以下の構成でコマンドを実行させる（複数指定が可能）
-p <ホスト側で使用するポート>:<コンテナ側で使用するポート>

　（５）．Dockerコンテナ起動

```ruby:コマンド(root)
# DockerのContainerIDを確認
docker ps -a
# DockerのContainerIDを使用し起動
docker exec -it <ConatainerID> /bin/bash
```

　（６）．サービス起動確認
※SSHとJenkinsのサービスを確認
※すでにできてるなら無視！

```ruby:コマンド(root)
[jenkins]
systemctl enable jenkins.service
systemctl start jenkins.service

[ssh]
systemctl enable sshd
systemctl start sshd
```

####【3】コンテナへのSSHクライアントログイン
　（１）．コンテナをポートバインド（以下補足参照）で起動させる

```ruby:コマンド(root)
docker run -p 8033:8080 -p 7033:22 -itd --privileged centos/jenkinsbuild:1 /sbin/init
```

```ruby:実行結果
[root@hoge-c01 ~]# docker ps -a
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS                                          NAMES
064989cee0cf        centos/jenkinsbuild:1   "/sbin/init"        10 seconds ago      Up 8 seconds        0.0.0.0:7033->22/tcp, 0.0.0.0:8033->8080/tcp   xxxxxxx
[root@hoge-c01 ~]# 
```

　（２）．TeraTerm(SSHクライアント)を起動
![Docker2.png](https://qiita-image-store.s3.amazonaws.com/0/150678/5d84fa38-a476-0916-e21b-5da5641d0e3a.png)




　（３）．ホストIPを指定し,ポートをポートバインドで割り当てた<ServerPort>を指定

####【4】コンテナ起動確認(Jenkinsコンテナ)

　（１）．コンテナをポートバインドで起動させる

```ruby:コマンド(root)
# docker run -p 8033:8080 -p 7033:22 -itd --privileged centos/jenkinsbuild:1 /sbin/init
※上記同様の為割愛
```

　（２）．作業端末のWEBブラウザに以下を入力
http://<hostip>:8033
![Docker3.png](https://qiita-image-store.s3.amazonaws.com/0/150678/554df236-37b6-4851-749a-3513e80daf86.png)




補足）Docker関連コマンド

```ruby:コマンド
# 今現在起動しているDockerプロセスの確認
docker ps -a

# ホストとコンテナの切り替え
コンテナ内で・・・
(ctrl+p+q)

# Dockerの停止
docker stop <ContainerID>

# Dockerプロセスの破棄
docker rm <ContainerID>

# Dockerプロセスの破棄(強制)
docker rm -f <ContainerID>

# Docker image 確認
docker images

# Docker image 破棄
docker rmi <imageID>

# Docker image 破棄(強制)
docker rmi -f <imageID>

# Docker 起動
docker run -it <REPOSITORY:TAG> /bin/bash

# Docker 起動(特権モード（サービス操作))
docker run -itd --privileged <REPOSITORY:TAG> /sbin/init
docker exec -it <ContainerID> /bin/bash

# Docker 起動(ポートバインド)
docker run -p <hostport:containerport> -p <hostport:containerport> -itd --privileged <REPOSITORY:TAG> /sbin/init
docker exec -it <ContainerID> /bin/bash

# Docker imagefile path
これを消したらimageすべてを消すことになる
```

---

##■まとめ
　結構簡単でした。お手軽に環境が作れるのでお勧めです。次回は同じ手法を使ってAnsibleのDokerfileを作成します。その後こんかいで作ったJenkinsと連携させます