気になった用語をまとめた
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され、AWSへSSH接続する際の鍵として使用する
- pemファイルはchmod 400 file で権限を設定する(詳細はググる)
- ssh -i pemファイル username@hostnameでSSHでAWSへ接続する、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/).