Docker总结
我在编程学校里有使用Docker的经验,但是因为有段时间没有使用,所以已经忘得差不多了,所以我复习了一下。
Docker命令
ログインする
docker login
イメージを削除する
docker rmi
imageに名前をつける
docker tag IMAGE_ID IMAGE_NAME:TAG
docker hubからイメージをpull
docker pull
docker hubにイメージをpush
docker push
如果尚未捆绑完成的话,
-
- docker-compose down/ docker-compose build/ docker-compose up
- でdownし直してから、再度buildとupをする
或者,您可以执行以下命令,进入后端容器并执行bundle install。
-
- コンテナの再起動ポリシーを上書きし、コンテナの実行後に削除
- docker-compose run –rm image bash
コンテナ作成+スタート
docker run
#run = create + start
プロセスを表示
docker ps -a
コンテナに入る
docker run -it ubuntu bash
-i: インプット可能 -t: 表示を綺麗にする
containerを止める
docker stop container
停止したコンテナをup状態にする。まだ、containerには入っていない。
docker restart container
コンテナに入る
docker exec -it container bash
コンテナに名前をつける
docker run —name ubuntu
给容器命名的目的包括以下三点。
-
- 创建一个持续运行的容器,
-
- 使用共享服务器,
- 在其他程序中使用时
containerを削除する
docker rm container
containerを全削除する
docker system prune
detached mode コンテナを起動後にdetachする(バックグラウンドで動かす)
docker run -d
foreground modeコンテナをexit後に削除する(1回きりのコンテナ)
docker run —rm
更新Docker镜像的方法
用容器创建Docker镜像。
- docker commit container
xxx ~ % docker commit 98hogehogeohe ubuntu:updated
#:でタグ付けしている
sha256:7hogehogeohoegoeohehoehoeogeohoeoheoohogeoheg644d7ab3c8690e8147e6
xxx ~ % docker images
#imageが2個できていることを確認。
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu updated 76sgsgasdgsd 18 seconds ago 77.8MB
ubuntu latest d2hogehogeho 11 months ago 77.8MB
通常情况下,从Docker文件创建镜像比第一种方法更常见。
Docker文件
使用Docker文件来创建Docker镜像,它可以被视为Docker镜像的设计蓝图。
移動到存在Docker文件的目录,并使用以下命令创建镜像。
docker build .
・刚出炉的形象 (TAG 无) 是悬而未决的形象
docker images -f dangling=true
#で検索できる。
FROM
ベースとなるイメージを決定
DockerファイルはFROMから始める
基本的には、OSを指定する=>ubuntuやalpine
alpineは5MBなので軽量で使用可能
RUN
Linuxコマンドを実行
RUNを使うことで好きなようにカスタマイズ
RUN毎にLayerが作られる
CMD
コマンドのデフォルトのコマンド
CMD[“executable”, “param1”, ”param2”] 例えば、[“/bin/bash“]みたいな感じ。
原則Dockerファイルの最後に記述
Layerは作らない
CMDとENTRYPOINTは似ているので注意!
在Ubuntu中,可以使用apt-get(或apt)命令进行软件包管理。
-
- apt-get update:
-
- 新しいパッケージリストを取得
-
- apt-get install
- パッケージをインストール
最佳实践:尽量减少Docker镜像的分层数!分层是通过以下两个指令:RUN,COPY和ADD来实现的。
-
- コマンドを &&でつなげる
- バックスラッシュで改行する
确认一切都正常后,将RUN合并为一个。
为什么要指定当前目录而不是指定Docker文件?因为可以将该目录作为构建上下文来使用!
在Docker中,一旦构建完成,就会传递给Docker守护进程。
通常情况下,不会将无需用于构建的文件放入构建上下文中。
如果有需要使用的文件,可以使用ADD或COPY将构建上下文中的文件添加到镜像中。
复制
COPY <src> <destination>
如果使用这个东西,可以将放在build context中的文件等带到容器中。
增加
可以做类似于复制的事情。
那么,COPY和ADD的区别是什么?
如果只是简单地拷贝文件或文件夹
添加
想要复制并解压缩tar压缩文件的情况
如果构建上下文中没有名为Dockerfile的文件
当以以下方式执行时,可以指定除了构建上下文之外的其他内容。
docker build -f <docker file name><build context>
# パスでも指定可能
docker build -f ../Dockerfile.dev
设置环境变量
ENV <key> <value>
ENV <key>=<value>
展示环境变量的清单
$ env
工作目录
更改Docker指令的执行目录。
RUN指令会在根目录下执行,例如,
RUN mkdir sample_folder
RUN cd sample_folder
RUN touch sample_file
描述如下,样本文件夹中不会创建文件。
那么,如何在文件夹中创建文件?
使用WORKDIR来得出结论。
FROM ubuntu:latest
RUN mkdir sample_folder
#絶対パスで指定する
WORKDIR /sample_folder
RUN touch sample_file
- WORKDIRを使用する場合は、勝手にフォルダを作ってくれるのでRUN mkdirする必要はない。
将文件系统挂载到容器上(听起来超级重要)
-v host:container
使用容器,可以模拟宿主机的文件系统。代码放在宿主机上,使用容器作为执行环境和分析环境。
指定用户ID和组ID以运行容器。
当尝试在Dockerfile中写入created_in_Dockerfile时,会遭到权限拒绝。
使用ls -la命令检查权限,结果如下所示。
将Docker镜像压缩为tar文件。
docker save myimage > mydocker.tar
ssh -i mydocker.pem ubuntu@<hostname>
# tarファイルをDockerimageに変換
docker load < mydocker.tar
docker run -it myimage bash
使用ec2的私钥文件(pem key)进行sftp操作。
sftp -i mydocker.pem ubuntu@<hostname>
#ec2にデータを転送する
put local/path
# ec2からデータを受信する
get remote/path
docker-compose
Docker组合
当使用Docker命令启动容器时,需要指定选项。
例如,可以使用-it、-v、-p等多个选项。
由于每次都将其描述下来太长而且麻烦,所以提前设置好这个配置,并使用docker-compose命令来简化操作。
而且,还有另一个理由是似乎可以在想要使用多个Docker容器的情况下使用。
docker-compose命令
docker-compose.ymlを元にコンテナ群を作成し起動
docker-compose up
Dockerイメージのビルド
–build
Dockerコンテナをバックグラウンドで起動
-d
停止容器
docker-compose stop
删除容器
docker-compose rm -f
docker-compose.ymlを元にコンテナ群を停止して削除
docker-compose down
Dockerコンテナの再起動
docker-compose restart
Dockerコンテナが起動しているか確認
docker-compose ps
コンテナでコマンド実行コマンド
docker-compose run [コンテナ名] [コンテナで実行したいコマンド]
docker-compose exec [コンテナ名] [コンテナで実行したいコマンド]
Gemfileに記述したGemをインストール
docker-compose build
运行和执行的区别
跑步 bù)
-
- コンテナを新しく作って実行する。
-
- 「docker-compose up」等でコンテナが起動していなくても使える。
-
- 新しいコンテナに接続するのでコマンド履歴が残らない。
- 低速用途コンソール用のコンテナ等、普段は立ち上げもしないが、いざコマンド作業の際にのみ使うコンテナで作業をする場合はこれを使う。
执行
-
- docker-compose up などで起動しているコンテナを利用する。
-
- 起動中の docker コンテナがないと実行できない。
-
- 同じコンテナに接続するのでコマンド履歴が残っている。
- 高速用途DBコンテナ等、普段から当たり前に立ち上げているコンテナに接続する場合はこちらを使う。
搭建RAILS的环境
version: '3'
volumes:
db-data:
services:
web:
build: .
ports:
- 3000:3000
volumes:
- ".:/product-register"
environment:
- "DATABASE_PASSWORD=postgres"
tty: true
stdin_open: true
depends_on:
- db
links:
- db
db:
image: postgres
volumes:
- "db-data:/var/lib/postgresql/data"
environment:
- 'POSTGRES_USER=postgres'
- 'POSTGRES_PASSWORD=postgres'
dockerfile
FROM ruby:2.5
RUN apt-get update && apt-get install -y \
build-essential\
libpq-dev\
nodejs\
postgresql-client\
yarn
WORKDIR /product-register
COPY Gemfile Gemfile.lock /product-register/
RUN bundle install
创建Rails项目
docker-compose run web rails new . --force --no-deps --database=postgresql
docker-compose build
请配置数据库连接。
default: &default
adapter: postgresql
encoding: utf8
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
host: db
username: <%= ENV['POSTGRES_USER'] %>
password: <%= ENV['POSTGRES_PASSWORD'] %>
development:
<<: *default
database: app_development
test:
<<: *default
database: app_test
.
.
.
创建数据库
docker-compose run web rails db:create
启动图像
执行docker-compose up命令后,访问http://localhost:3000/,如果能够正常显示页面则表示成功。
顺便提一下,由于在本地环境中使用了docker-compose.yml文件中的ports配置,其中左侧的3000:3000端口用于本地,所以如果将其更改为其他端口,请使用对应的端口进行访问。右侧是docker的端口。