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
要在dockerhub上推送时注意将映像的名称和仓库的名称保持一致。在以下名称更改命令中更改后再进行推送:docker tag。

コンテナ作成+スタート
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

给容器命名的目的包括以下三点。

    1. 创建一个持续运行的容器,

 

    1. 使用共享服务器,

 

    在其他程序中使用时

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进行构建。
确认一切都正常后,将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的端口。

广告
将在 10 秒后关闭
bannerAds