ソニックの部屋

主にプログラミングに関する記事を投稿します

Dockerまとめ

気になった用語をまとめた

Linuxについて

  • Linuxのコンテナ技術を使用するためLinuxの知識が必要
  • shell(bash, zsh...)を仲介してkernelにアクセスする
  • ターミナルはshellを動かすためのアプリ(shellとは別の概念)
  • 環境変数とはOS上で動くプロセスが情報を共有するための変数
  • echo $SHELLでshellのpathを表示
  • export AGE=20などで環境変数を作成
  • export $AGEなどで環境変数を表示

Dockerについて-基礎

  • 基礎コマンド

    • docker login
    • docker pull image名→pullする前に対象のイメージがローカルにある場合は削除が必要
    • docker images
    • docker run image名→create(コンテナの作成) + start(デフォルトコマンドの実行と exit )
    • docker ps -a
    • docker run -it image名 bash→コンテナの中のbashを操作する
    • exit→コンテナから出る(基本的にはこちらを使う)
    • ctrl+p+q→コンテナから出るがプロセス起動(up)のまま(デタッチという)
    • docker restart コンテナ名→コンテナ起動
    • docker exec -it コンテナ名 bash→(コンテナ起動後)コンテナへ入る
    • docker attach コンテナ名→ (元のプロセスの) コンテナへ入る
    • docker commit コンテナ名 新image名:tag名→コンテナから新イメージを作る
    • docker tag 旧イメージ名 新イメージ名→イメージ名の変更
    • docker push Hub上のユーザ名/ イメージ名→pushするイメージはHub上のリポジトリ名と同じ必要がある
    • docker rmi イメージ名→イメージの削除
    • docker image prune -a→全てのイメージの削除(コンテナ削除後に実行)
    • docker stop コンテナ
    • docker rm コンテナ名→stopしてから実行(-fで停止+削除)
    • docker system prune→コンテナ全削除
    • docker inspect コンテナ名→コンテナの詳細(CPU, メモリの上限等)を表示
  • runのオプション

    • -itは-i:インプット可能(ホストからコンテナへ接続)、-t:出力を綺麗に表示、を組み合わせたもの
    • 起動させ続ける、共有サーバを使うときは run --name 名前 でコンテナに名前を付けるのがよい
    • -dはコンテナ起動後にupとなりバックグラウンドで動かす
    • -rmはコンテナExit後に削除する(一回きりのコンテナ)
    • -v hostの絶対path:containerのpath はホストのファイルシステムをコンテナにマウントする
    • -u $(id -u):$(id -g)は所有者とグループ権限を設定する
    • -p host_port:container_portはホストのポートをコンテナのポートにつなげる
    • runは対象のイメージがなければHubから自動でpullをする
  • Dockerfile

    • imageの設計図のこと(imageからでは詳細がわからない)
    • テキストファイル形式
    • docker build -t name . →(dockerfileがあるディレクトリで)dockerfileからイメージを作成
    • FROM ベースとなるイメージを決定、FROMから書き始める、大半がOSを指定
    • RUN Linuxコマンドを実行し必要なパッケージをインストールする等、 イメージレイヤーを作る(書きすぎるとimageが大きくなるので最小限にする)、コンテナ内のroot直下で実行される(実行場所を変える場合は&&でつなぐかWORKDIRを記述する)
    • 最小限にするにはコマンドを&&でつなげ、\で改行し、一行にまとめる
    • ただし、Dockerfileをメンテする際はRUNを複数行に分けて書くことでcacheを利用し、うまくインストールすることが確認できたら最後に&&で一行で書くのがよい
    • CMD デフォルトコマンドを指定する([""]を記述)、 最後に記述する、 イメージレイヤーを作らない(イメージレイヤーがないためimageを起動する際に初めて実行する)
    • COPY(ADD) ファイル 移動先ディレクト
    • docker build -f Dockerfilename build contextでbuild contextにDcokerfileがない場合のビルドの方法
    • ENTRYPOINTを設定するとCMDの上書き不可(参考程度でよい)
    • ENV key value環境変数を設定する
    • WORKDIR /optで他のユーザが作業しやすいように/optとするのが一般的
    • コンテナ上でインストールが可能なコマンドを確認してそれをDockerfileに記述していくのが実務の流れ
  • 全般

    • コンテナ上で環境構築していく
    • Docker起動時はデフォルトでroot権限となるため注意
    • Docker Hub上のリポジトリ名について二単語以上は-でつなぐ
    • Dockerレジストリはイメージを保管する所でその一つがDocker Hub
    • イメージはtagでバージョン管理
    • コンテナを実行した際のデフォルトコマンドが何か、デフォルトコマンドを上書き出来る点が重要(run image名 デフォルトコマンド名)
    • 同じ名前のコンテナを作成することは不可
    • ホスト、コンテナ間の独立性があるのが重要
    • Docker daemonはイメージやコンテナを管理する
    • build contextとはDcokerfileがあるディレクトリのこと
    • buildすることでbuild contextがdaemonに渡される
    • ADDやCOPYでbuild contextの中にあるファイルをimageに持っていける
    • 単純にファイルやフォルダをコピーする場合はCOPYを使う
    • tar圧縮ファイルをコピーして解答する場合はADDを使う
    • コンテナをwebサーバーとすることはよくある
    • その際ホストのportとコンテナのportをつなげることをパブリッシュという
    • sh -x shファイル でshファイルのオプションを確認
    • command+pでファイルを開くショートカット

PATHを通すとは

  • 環境変数$PATHにパスを追加することでPCがプログラムをそのパスから探してきてくれるようになる
  • echo $PATHで今どこにパスが通っているか確認する
  • export PATH=/path/to/something:$PATHでパスを追加する

Dockerについて-応用

  • AWS関連

    • インスタンス作成時にキーペアを設定するとpemファイルが作成DLされ、AWSSSH接続する際の鍵として使用する
    • pemファイルはchmod 400 file で権限を設定する(詳細はググる
    • ssh -i pemファイル username@hostnameでSSHAWSへ接続する、hostnameはインスタンスのパブリック IPv4 DNSを指定
    • ローカルからホストのAWSへ接続する
    • ホスト(AWS)にDockerをインストールしコンテナをたてる
    • docker save イメージ > xxx.tar でイメージをtarファイルに圧縮する
    • sftp -i pemファイル username@hostnameでSFTPでtarファイルをAWSへアップする
    • sftp接続後、put ローカルのtarファイルのパス でAWSへファイルをアップする
    • sftp接続後、get リモートのtarファイルのパス でローカルへファイルをDLする
    • ssh接続後、docker load < tarファイル でイメージを解凍
    • GPUとはグラフィックのことで計算が得意
  • Docker compose

    • コンテナを複数使う場合又はdocker runコマンドが長くなる時に有用
    • 1コンテナ1サービスが原則
    • コンテナをどのように起動するかを記述するファイル(runコマンドのオプションに該当)
    • docker-compose up (--build) →build+runを実行(imageを更新した時は--buildを付ける)
    • docker-compose ps
    • docker-compose down →stop+rmを実行
    • docker-compose exec web(サービス名) bash →コンテナに入る
    • rails s -b 0.0.0.0 →コンテナ上で実行するとrailsサーバが立ち上がる(0.0.0.0とはローカルホストのこと)

CICD

  • Travis CIはCIツール(テスト・デプロイツール)の一つ
  • .travis.ymlファイルにテストの流れを記述し Githubにpushした時に(mainでなくとも) その通りに自動でテストが実行される
  • Herokuはアプリケーション実行環境の一つ
  • HerokuとGitHubを連携させ、 GitHubのmainにプッシュした時に テスト後に自動で本番環境に新しいバージョンのアプリがデプロイされる
  • デプロイコードは.travis.ymlファイルに記述する

参考文献
かめ れおん, 2023, 「米国AI開発者がゼロから教えるDocker講座」, udemy, (2023/8/19取得,https://www.udemy.com/).