私の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のインストール
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=falsefalse
      -i, --interactive=false     STDIN  -t, --tty=false              tty  ,         ,   false
      -u, --user=""                     
      -a, --attach=[]                (    docker run -d     )
      -w, --workdir=""                    
      -c, --cpu-shares=0            CPUCPU      
      -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=""                          CPUCPU
      --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=trueSIGCHLDSIGSTOP SIGKILL      
  • である.
  • docker build -t yyyy xxxx構築dockerミラー(yyyy:ミラーの名前、xxxx:dockerFileの所在ディレクトリ)
  • mysqlのインストール
    最新版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 bashmysqlの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 

    コードホームの下:
  • gradleでパッケージコードをコンパイルすると、実行可能なjar
  • が生成されます.
  • dockerミラー
  • を構築
  • dockerミラー
  • を実行
    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の第1の命令は一般的にFROMであり、1つのベースミラーから
  • を構築することを示す.
  • ミラーを変更するコマンドを実行する
  • 更新をコミット
  • は、今回の更新に基づいて、新しいコンテナ
  • を実行する.
  • は、次のコマンド
  • の実行を継続する.
    このように繰り返し実行すると...
    このミラーは、構築中に新しいミラーが生成されるたびにキャッシュされます.後のステップでコンストラクションに失敗しても、再コンストラクションすると失敗したレイヤのミラーの前のコマンドから実行されます.
    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で実行)
  • コンテナの起動後に実行するコマンドを構成し、docker runが提供するパラメータで上書きできません.
    各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のその他の注意事項
  • はいずれもディレクトリ
  • でなければならない.
  • "は、コンテナ内の絶対パス
  • である必要があります.
  • パスが存在しない場合、実行が完了すると、dockerはホストホストにディレクトリを作成します.` , , /var/lib/docker/volumes/`
  • は、docker run -it -vのような経路が1つしかない場合、匿名マウントと呼ばれ、 container , `/var/lib/docker/volumes/` container
  • に対応する.
  • コンテナが破棄された後、-vによってホスト上に作成されたディレクトリは、mountがどのようにしても破棄されません.
  • およびは、いずれもディレクトリ
  • である必要がある.
  • は、容器内の絶対経路
  • である必要がある.
  • パスが存在しない場合、実行が完了するとdockerはホストホストにディレクトリを作成します.は相対パスを使用できますが、相対は現在の作業ディレクトリではなく、/var/lib/docker/volumes/
  • です.
  • は、例えばdocker run -it -v のようなパスが1つしかない場合、匿名マウントと呼ばれ、はcontainerの位置を表し、宿主機会は/var/lib/docker/volumes/の下でランダムにcontainerのに対応する
  • のディレクトリを作成する.
  • コンテナが破棄された後、-vによってホスト上に作成されたディレクトリは、mountがどのようにしても破棄されません.