私のdocker探求の道
14356 ワード
任意の転載が可能で、転載する時文章の原始の出所を明記してください-scriptShi
前言
dockerは理解して使用する場合があるが、使用もDevOpsで使用されており、マクロ的な理解は1つしかないため、dockerの様々な具体的な使用にも慣れていないため、メモリができれば自分のクラウドサーバをすべてdocker化することにした.
試験機の紹介
本来は自分の仮想マシンの中にありますが、あまり爽やかではありません.仮想マシンには16 Gメモリ、8 Cには小さなdockerが設置されています.cpuやメモリの使用は本当に見ることができません.生産環境で直接効果を見たいと思っています.
サーバーはアリクラウドのもので、今日買ったばかりの1年の学生機、1 C 2 G 40 G-SSD 1 M、以下の通りです.
インストールされているOSはcentos 7.3です
dockerのインストール
起動の設定:
テストhelloworld:
dockerでよく使う操作を並べて、記念にしましょう.ポイントは起動/停止/削除、ログを見たり、コンテナに入れたりすればいいのです. を実行する を停止する. を削除する. を削除する. である. mysqlのインストール
最新版mysqlのインストール:コンテナ名、データボリュームの分離、ポートの露出、パスワードの設定、バックグラウンド起動、ポリシーの再起動、リモートミラー名の設定(バージョン番号なしのデフォルト最新版)
よく使われるのはmysqlをインストールするときに使ったものです.
docker容器内部へ:
自分のパソコンにリモートサーバを接続し、リモート接続テストを行います(まず、安全ではないことと生産環境が絶対的に
以下のように、テストに成功しました.
SpringBootサービスの導入
hiが1つしかないwebサービスを書きました.https://github.com/xjtushilei/jenkins-test.git
簡単なDockerfileを書きました(次の節ではdockerFileの書き方を簡単に説明します)
実は3行でできます.多く書くのは主に練習のためです.
それぞれdockerで構築しdockerの外で試してみました.(具体的にどの方式を取るかはDevOps次第ですが、自分で開発するならdocker外でしょう.そうでないと、maven中央倉庫からjarパッケージを引っ張るたびにつらいので、国内のソースに変えてもいいです.docker内で構築すれば、外部コードのコンパイルを省略してコードからdockerミラーに直接移行できますが、リリース時間が延長されます)
まずコードを引き下ろして
コードホームの下: gradleでパッケージコードをコンパイルすると、実行可能なjar が生成されます. dockerミラー を構築 dockerミラー を実行
以下に示すように、自分のdockerを構築することに成功しました.
直接
リモートテストに成功しました:
これまでも、自分のdockerをどのように公開するかを学びました.ここではアリクラウドのコンテナミラーサービスをお勧めします.特に便利です.自分でpullコードを引く必要はなく、git内のコードの変化を直接彼らのサービスで検出し、ミラーを動的に更新します.
Dockerfileの概略フロー Dockerfileの第1の命令は一般的にFROMであり、1つのベースミラーから を構築することを示す.ミラーを変更するコマンドを実行する 更新をコミット は、今回の更新に基づいて、新しいコンテナ を実行する.は、次のコマンド の実行を継続する.
このように繰り返し実行すると...
このミラーは、構築中に新しいミラーが生成されるたびにキャッシュされます.後のステップでコンストラクションに失敗しても、再コンストラクションすると失敗したレイヤのミラーの前のコマンドから実行されます.
DockerFileの書き込み
DockerFileは、ベースミラーメッセージ、メンテナ情報、ミラー操作命令、コンテナ起動時実行命令の4つの部分に分かれています.
DockerFileの一般的なコマンドについて説明します
FROM
フォーマットはFROMまたはFROM:です.
1番目の命令はFROM命令でなければなりません.また、同じDockerfileで複数のミラーを作成する場合は、複数のFROMコマンドを使用できます(高バージョンdockerはasとの組み合わせを推奨します).
MAINTAINER
フォーマットはMAINTAINERで、メンテナ情報を指定します.
RUN
フォーマットは、
前者はshell端末でコマンド、すなわち/bin/sh-cを実行する.後者はexecを使用して実行されます.他の端末を使用することを指定することは、第2の方法、例えば
各RUNコマンドは、現在のミラーに基づいて指定されたコマンドを実行し、新しいミラーとしてコミットします.コマンドが長い場合は、を使用して改行できます.
CMD
3種類のフォーマットをサポート
コンテナを起動するときに実行するコマンドを指定します.DockerfileごとにCMDコマンドは1つしかありません.複数のコマンドが指定されている場合、最後のコマンドのみが実行されます.
ユーザがコンテナを起動するときに実行するコマンドを指定した場合、CMDで指定したコマンドは上書きされます.
EXPOSE
フォーマットは
Dockerサービス側のコンテナに露出したポート番号を教えて、相互接続システムで使用します.
ここでは単に,ホストホストに呼び出したい場合runが必要な場合−pにポート転送を行うことを教える.
ENV
フォーマットは
たとえば
ADD
フォーマットは
このコマンドは、指定したコンテナにコピーされます.Dockerfileが存在するディレクトリの相対パスであってもよい.URLであってもよい.tarファイル(ディレクトリに自動的に解凍)でも構いません.
COPY
フォーマットはCOPYです.
ローカルホスト(Dockerfileが存在するディレクトリの相対パス)をコンテナにコピーします.
ローカルディレクトリをソースディレクトリとして使用する場合は、COPYを推奨します.これはADDとの主な違いです.
ENTRYPOINT
2つのフォーマット: コンテナの起動後に実行するコマンドを構成し、docker runが提供するパラメータで上書きできません.
各Dockerfileには1つのENTRYPOINTしかありません.複数を指定すると、最後の1つだけ有効になります.
VOLUME
フォーマットは
ローカルホストまたは他のコンテナからマウントできるマウントポイントを作成します.一般的には、データベースや保持する必要があるデータなどを格納します.
USER
フォーマットはUSER daemon.
コンテナの実行時のユーザ名またはUIDを指定し、その後のRUNも指定したユーザを使用します.
サービスが管理者権限を必要としない場合、このコマンドで実行ユーザーを指定できます.また、RUNグループpadd-r postgres&&useradd-r-g postgres postgresなど、以前に必要なユーザーを作成することができます.管理者権限を一時的に取得するには、sudoを推奨せずにgosuを使用します.
WORKDIR
フォーマットはWORKDIR/path/to/workdirです.
後続のRUN、CMD、ENTRYPOINT命令の作業ディレクトリを構成します.
複数のWORKDIR命令を使用することができ、後続の命令は、パラメータが相対パスである場合、前の命令によって指定されたパスに基づいている.たとえば
最終パスは/a/b/cです.
dockerのその他の注意事項 でなければならない."は、コンテナ内の絶対パス である必要があります.パスが存在しない場合、実行が完了すると、dockerはホストホストにディレクトリを作成します. は、 に対応する.コンテナが破棄された後、-vによってホスト上に作成されたディレクトリは、mountがどのようにしても破棄されません. である必要がある. である必要がある.パスが存在しない場合、実行が完了するとdockerはホストホストにディレクトリを作成します. です.は、例えば のディレクトリを作成する.コンテナが破棄された後、-vによってホスト上に作成されたディレクトリは、mountがどのようにしても破棄されません.
前言
dockerは理解して使用する場合があるが、使用もDevOpsで使用されており、マクロ的な理解は1つしかないため、dockerの様々な具体的な使用にも慣れていないため、メモリができれば自分のクラウドサーバをすべてdocker化することにした.
試験機の紹介
本来は自分の仮想マシンの中にありますが、あまり爽やかではありません.仮想マシンには16 Gメモリ、8 Cには小さなdockerが設置されています.cpuやメモリの使用は本当に見ることができません.生産環境で直接効果を見たいと思っています.
サーバーはアリクラウドのもので、今日買ったばかりの1年の学生機、1 C 2 G 40 G-SSD 1 M、以下の通りです.
インストールされているOSはcentos 7.3です
dockerのインストール
yum update
curl -fsSL https://get.docker.com/ | sh
service docker start
起動の設定:
systemctl enable docker
アリクラウドの「開発者プラットフォーム」でソースを変更し、国内のミラーに変更し、速度を向上させる(スクリプトのxxxxは個人独自で、アリクラウドによって生成される).sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <'EOF'
{
"registry-mirrors": ["https://xxxxxxxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
テストhelloworld:
docker run hello-world
一般的なdockerコマンドdockerでよく使う操作を並べて、記念にしましょう.ポイントは起動/停止/削除、ログを見たり、コンテナに入れたりすればいいのです.
docker ps -a
すべてのコンテナを表示docker exec -it xxxxxx /bin/bash
容器に入りbashのshell(xxxxは容器名またはid)docker stop $(docker ps -q)
全運転中の容器docker rm $(docker ps -aq)
全容器docker stop $(docker ps -q) & docker rm $(docker ps -aq)
コンテナの非アクティブ化と削除を実現するコマンド:docker images | grep -E "(aaa|bbb)" | awk '{print $3}' | uniq | xargs -I {} docker rmi --force {}
指定名を含むDocker Image(aaaまたはbbbを含むイメージファイル)docker logs -f xxxxxx
コンテナのログ(xxxxx:idまたはname、-f:リアルタイムログの表示、-tail=10:最後の10のログの表示)docker run
runのパラメータは、 -d, --detach=false , false
-i, --interactive=false STDIN,
-t, --tty=false tty , , false
-u, --user=""
-a, --attach=[] ( docker run -d )
-w, --workdir=""
-c, --cpu-shares=0 CPU , CPU
-e, --env=[] ,
-m, --memory=""
-P, --publish-all=false
-p, --publish=[]
-h, --hostname=""
-v, --volume=[] ,
--cap-add=[] , :http://linux.die.net/man/7/capabilities
--cap-drop=[] , :http://linux.die.net/man/7/capabilities
--cidfile="" , PID ,
--cpuset="" CPU, CPU
--device=[] ,
--dns=[] dns
--dns-search=[] dns , /etc/resolv.conf
--entrypoint="" image
--env-file=[] ,
--expose=[] ,
--link=[] , IP、env
--lxc-conf=[] , --exec-driver=lxc
--name="" , ,links
--net="bridge" :
bridge docker daemon
host //
container:NAME_or_ID >// , IP PORT
none ( --net=bridge),
--privileged=false , capabilities
--restart="no" :
no:
on-failure: ( )
always:
unless-stopped: ,
--rm=false ( docker run -d )
--sig-proxy=true , SIGCHLD、SIGSTOP SIGKILL
docker build -t yyyy xxxx
構築dockerミラー(yyyy:ミラーの名前、xxxx:dockerFileの所在ディレクトリ)最新版mysqlのインストール:コンテナ名、データボリュームの分離、ポートの露出、パスワードの設定、バックグラウンド起動、ポリシーの再起動、リモートミラー名の設定(バージョン番号なしのデフォルト最新版)
docker run --name mysql -v /data/mysql:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD= -d --restart=unless-stopped mysql:5.6.35
よく使われるのはmysqlをインストールするときに使ったものです.
docker容器内部へ:
docker exec -it mysql bash
mysqlのshellインタフェースに入ります:mysql -uroot -p mysql
思い出す前にmysqlをインストールするのは面倒ですね.dockerは私を喜ばせた.自分のパソコンにリモートサーバを接続し、リモート接続テストを行います(まず、安全ではないことと生産環境が絶対的に
であることを知っておく必要があります.次に、ファイアウォールを開く必要があります).以下のように、テストに成功しました.
SpringBootサービスの導入
hiが1つしかないwebサービスを書きました.https://github.com/xjtushilei/jenkins-test.git
簡単なDockerfileを書きました(次の節ではdockerFileの書き方を簡単に説明します)
FROM openjdk:8-jdk-alpine
RUN mkdir -p /root/workspace/project
WORKDIR /root/workspace/project
COPY build/libs/*.jar app.jar
#RUN set -ex && ./gradlew build
#RUN cp build/libs/*.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/root/workspace/project/app.jar"]
実は3行でできます.多く書くのは主に練習のためです.
それぞれdockerで構築しdockerの外で試してみました.(具体的にどの方式を取るかはDevOps次第ですが、自分で開発するならdocker外でしょう.そうでないと、maven中央倉庫からjarパッケージを引っ張るたびにつらいので、国内のソースに変えてもいいです.docker内で構築すれば、外部コードのコンパイルを省略してコードからdockerミラーに直接移行できますが、リリース時間が延長されます)
まずコードを引き下ろして
yum install git # , git,
git clone https://github.com/xjtushilei/jenkins-test.git
cd jenkins-test
コードホームの下:
yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel # , jdk,
./gradlew build
docker build -t hi .
以下に示すように、自分のdockerを構築することに成功しました.
直接
運転:docker run -p 8080:8080 hi
には、以下のよく知られているインタフェースが表示されます.リモートテストに成功しました:
これまでも、自分のdockerをどのように公開するかを学びました.ここではアリクラウドのコンテナミラーサービスをお勧めします.特に便利です.自分でpullコードを引く必要はなく、git内のコードの変化を直接彼らのサービスで検出し、ミラーを動的に更新します.
Dockerfileの概略フロー
このように繰り返し実行すると...
このミラーは、構築中に新しいミラーが生成されるたびにキャッシュされます.後のステップでコンストラクションに失敗しても、再コンストラクションすると失敗したレイヤのミラーの前のコマンドから実行されます.
DockerFileの書き込み
DockerFileは、ベースミラーメッセージ、メンテナ情報、ミラー操作命令、コンテナ起動時実行命令の4つの部分に分かれています.
#
From ubutu
#
MAINTAINER docker_user [email protected]
#
RUN apt-get update && apt-get install -y ngnix
RUN echo "
daemon off;">>/etc/ngnix/nignix.conf
#
CMD /usr/sbin/ngnix
DockerFileの一般的なコマンドについて説明します
FROM
フォーマットはFROMまたはFROM:です.
1番目の命令はFROM命令でなければなりません.また、同じDockerfileで複数のミラーを作成する場合は、複数のFROMコマンドを使用できます(高バージョンdockerはasとの組み合わせを推奨します).
MAINTAINER
フォーマットはMAINTAINERで、メンテナ情報を指定します.
RUN
フォーマットは、
RUN
またはRUN ["executable", "param1", "param2"]
です.前者はshell端末でコマンド、すなわち/bin/sh-cを実行する.後者はexecを使用して実行されます.他の端末を使用することを指定することは、第2の方法、例えば
RUN ["/bin/bash", "-c", "echo hello"]
によって実現することができる.各RUNコマンドは、現在のミラーに基づいて指定されたコマンドを実行し、新しいミラーとしてコミットします.コマンドが長い場合は、を使用して改行できます.
CMD
3種類のフォーマットをサポート
CMD ["executable","param1","param2"]
はexecを使用して実行され、推奨方式である.CMD command param1 param2
は/bin/shで実行され、インタラクションが必要なアプリケーションに提供される.CMD ["param1","param2"]
ENTRYPOINTに提供されるデフォルトパラメータ.コンテナを起動するときに実行するコマンドを指定します.DockerfileごとにCMDコマンドは1つしかありません.複数のコマンドが指定されている場合、最後のコマンドのみが実行されます.
ユーザがコンテナを起動するときに実行するコマンドを指定した場合、CMDで指定したコマンドは上書きされます.
EXPOSE
フォーマットは
EXPOSE [...]
です.Dockerサービス側のコンテナに露出したポート番号を教えて、相互接続システムで使用します.
ここでは単に,ホストホストに呼び出したい場合runが必要な場合−pにポート転送を行うことを教える.
ENV
フォーマットは
ENV
です.次のRUN命令で使用され、コンテナの実行時に保持される環境変数を指定します.たとえば
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD
フォーマットは
ADD
です.このコマンドは、指定したコンテナにコピーされます.Dockerfileが存在するディレクトリの相対パスであってもよい.URLであってもよい.tarファイル(ディレクトリに自動的に解凍)でも構いません.
COPY
フォーマットはCOPYです.
ローカルホスト(Dockerfileが存在するディレクトリの相対パス)をコンテナにコピーします.
ローカルディレクトリをソースディレクトリとして使用する場合は、COPYを推奨します.これはADDとの主な違いです.
ENTRYPOINT
2つのフォーマット:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
(shellで実行)各Dockerfileには1つのENTRYPOINTしかありません.複数を指定すると、最後の1つだけ有効になります.
VOLUME
フォーマットは
VOLUME ["/data"]
です.ローカルホストまたは他のコンテナからマウントできるマウントポイントを作成します.一般的には、データベースや保持する必要があるデータなどを格納します.
USER
フォーマットはUSER daemon.
コンテナの実行時のユーザ名またはUIDを指定し、その後のRUNも指定したユーザを使用します.
サービスが管理者権限を必要としない場合、このコマンドで実行ユーザーを指定できます.また、RUNグループpadd-r postgres&&useradd-r-g postgres postgresなど、以前に必要なユーザーを作成することができます.管理者権限を一時的に取得するには、sudoを推奨せずにgosuを使用します.
WORKDIR
フォーマットはWORKDIR/path/to/workdirです.
後続のRUN、CMD、ENTRYPOINT命令の作業ディレクトリを構成します.
複数のWORKDIR命令を使用することができ、後続の命令は、パラメータが相対パスである場合、前の命令によって指定されたパスに基づいている.たとえば
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
最終パスは/a/b/cです.
dockerのその他の注意事項
はいずれもディレクトリ` , ,
/var/lib/docker/volumes/`docker run -it -v
のような経路が1つしかない場合、匿名マウントと呼ばれ、 container , `/var/lib/docker/volumes/` container
は
および
は、いずれもディレクトリ
は、容器内の絶対経路
は相対パスを使用できますが、相対は現在の作業ディレクトリではなく、/var/lib/docker/volumes/
docker run -it -v
のようなパスが1つしかない場合、匿名マウントと呼ばれ、
はcontainerの位置を表し、宿主機会は/var/lib/docker/volumes/
の下でランダムにcontainerの
に対応する