Docker¶
Easiest Instralltion
$ curl -fsSL get.docker.com | sudo sh
$ sudo usermod -aG docker $USER
Instralltion
$ sudo apt-get update && sudo apt-get install -y \
apt-transport-https ca-certificates curl \
software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable"
$ sudo apt-get update && sudo apt-get install -y docker-ce && sudo usermod -aG docker $USER
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.12.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose && docker-compose -v
docker-compose version 1.12.0, build b31ff33
Basic Operation
$ docker pull ubuntu
$ docker pull ubuntu:latest # same as above
$ docker pull ubuntu:16.04
$ docker run -it ubuntu /bin/bash # ubuntu:latest
$ docker run -it ubuntu:16.04 /bin/bash # run: create + start
$ docker run -it --rm ubuntu /bin/sh # remove after termination
$ docker run -it --name "Baka" ubuntu /bin/sh # naming
$ docker run -d centos /bin/ping dpdk.ninja # -d: background-exe
$ docker rum --net='host' -it ubunt /bin/bash # use host's network stack (share)
$ docker run --rm ubuntu /bin/echo "Hello Docker"
$ docker rm `docker ps -aq` # Stoped container only
$ docker rm -f `docker ps -aq` # All container forcibly
$ docker ps --all
$ docker run -it -d --rm --name tttest ubuntu:16.04
$ docker commit tttest slankdev/ubuntu:16.04
$ docker push slankdev/ubuntu:16.04
[machine]$ docker run -it --name baka ubuntu /bin/bash
[ubuntu]# apt update && apt install -y sl
[machine]$ docker commit baka ubunt:slankdev
status確認
host$ docker stats test --format "table {{.Container}}\t{{.MemUsage}}"
その他¶
docker pull などでNetwork timed out が出た時は docker-machineを再起動しなおせば直る。
$ docker-machine restart MACHINENAME
$ eval $(docker-machine env MACHINENAME)
- http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html
- https://docs.docker.com/
Dockerfileの書き方¶
{命令} {引数} という感じにスペース区切りで記述していく。 ‘#’から始まる行はコメントとして処理される。
Dockerfileでは以下の命令を指定できる
| 命令 | 用途 | |:————|:———————————-| | FROM | 元となるDockerイメージを指定 | | MAINTAINER | 作成者情報 | | RUN | コマンド実行 | | ADD | ファイル/ディレクトリの追加 | | CMD | コンテナの実行コマンド1 | | ENTRYPOINT | コンテナの実行コマンド2 | | WORKDIR | 作業ディレクトリの指定 | | ENV | 環境変数の指定 | | USER | 実行ユーザの指定 | | EXPOSE | ポートのエクスポート | | VOLUME | ボリュームのマウント |
各それぞれの命令について記述していく。
FROM コンテナの元となるDockerイメージを指定する。 イメージはdocker hubから持ってきてるっぽい。 指定方法は{イメージ名}:{タグ名}という感じに指定してやればいい。
FROM [IMAGE]
FROM [IMAGE]:[TAG]
FROM [IMAGE]:[DIGEST]
FROM ubuntu:14.04 # DockerHubからubuntuの14.04を持ってくる
FROM ubuntu # DockerHubからubuntuのlatestを持ってくる
FROM
MAINTAINER Dockerfileの作成者情報を指定する。これはなくても大丈夫っぽい。 メールアドレスでも名前でもなんでも大丈夫なもよう。 Docker Hub でイメージ公開するなら必ず記述しとくこと
MAINTAINER [AUTHOR_INFO]
MAINTAINER slank.dev@gmail.com
MAINTAINER Hiroki Shirokura slank
RUN, CMD コマンドを実行する。RUNは外部パッケージとかのインストールをするために使う。 CMDはRUNなどで入れたパッケージとかの起動で使う。 sshdとかをコンテナで動作させる時はこれを使う。 Shell形式とExcel形式があるが、自分はShell形式しか使わないため、 Excel形式は省く。
RUN [COMMAND]
CMD [COMMAND]
RUN apt-get -y install openssh-server # sshdをインストールする
RUN yum -y install httpd # apacheをインストール
CMD /usr/sbin/httpd -D FOREGROUND # httpdをフォアグラウンドで実行
ADD ファイル/ディレクトリの追加を追加する時に指定する。 ディレクトリなどを共有する時に指定するっぽい
ADD Docker/tmp/ /tmp/
ADD http://hoge.com/bashrc /root/.bashrc
EXPOSE expose=晒す、のとおり、コンテナが外部に公開するポートを指定します。 WEBサーバなどなら80とかを指定する。
EXPOSE 80
EXPOSE 8080
DPDK¶
# docker pull slankdev/ubuntu:16.04
# echo 4 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages
# echo 2048 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
# mount -t hugetlbfs -o pagesize=1G none /dev/hugepages
# mkdir -p /mnt/huge_c0
# mount -t hugetlbfs -o pagesize=1G none /mnt/huge_c0
# docker run -it --rm --privileged -v /mnt/huge_c0/:/dev/hugepages/ --net='host' slankdev/ubuntu:16.04
- https://community.mellanox.com/docs/DOC-2978
- https://github.com/redhat-performance/docker-dpdk
Docker netns mount script¶
#!/bin/sh
if [ $# -ne 2 ]; then
echo "invalid command syntax" 1>&2
echo "Usage: $0 <containername> <netnsname>" 1>&2
exit 1
fi
PID=`docker inspect $1 -f "{{.State.Pid}}"`
mkdir -p /var/run/netns
ln -s /proc/$PID/ns/net /var/run/netns/$2
Changen escape key¶
It doesn’t need to restart docker daemon for apply new config. That’s good.
$ mkdir -p ~/.docker
$ vim ~/.docker/config.json
$ cat ~/.docker/config.json
{
"detachKeys": "ctrl-\\"
}
Remote control¶
# vim /lib/systemd/system/docker.service
# systemctl daemon-reload
# systemctl stop docker
# systemctl start docker
# docker -H tcp://localhost:2376 info
- ExecStart=/usr/bin/dockerd -H fd://
+ ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H fd://
client$ docker -H tcp://192.168.56.102:2376 info
client$ export DOCKER_HOST=tcp://192.168.99.36:2376
client$ docker info