부두 노동자의 세 가지 핵심 구성 요소 : 거울, 용기 및 창고

镜像(Image), 容器(Container), 仓库(Repository)우리는 자주 말 Docker세 가지 구성 요소, 사실, 우리는 기사에 "10 분 빨리 도커 필요한 기본 마스터" , 단순히 세 가지 구성 요소에 대한 지식에 대해 알고있다을하지만 아주 자세하게 설명하지 않았다, 그래서이 글에서, 우리는 함께 몇 가지 세부 사항을 살펴볼 것이다.

이미지 (이미지)

무엇 Docker거울은?

간단하게 이해 Docker镜像그것은되는 Linux파일 시스템 ( Root FileSystem실행할 수있는 파일 시스템 포함), Linux内核프로그램 및 해당 데이터를.

이 시점에서, 우리는 함께 그를 추가해야 할 수도 Linux관련 운영 체제의 지식 :

일반적으로 Linux두 부분으로 나누어 : Linux内核(Linux Kernel)用户空间, 그러나 진짜 Linux操作系统의미 Linux内核, 우리가 사용 Ubuntu, Centos다른 운영 체제는 서로 다른 제조업체 사실이다 Linux内核(에 근거하여 자신의 소프트웨어와 도구를 추가하는 tools형태의) 릴리스 버전 ( Linux Distribution).

따라서, 우리는 또한이 위에서 언급 한 미러링으로 볼 수있는 用户空间때, Docker당신은 거울을 통해 컨테이너를 생성, 미러가 정의 된 用户空间호스트 시스템에서 실행되는 독립 분리 공정으로 Linux内核합니다.

여기서 우리는 두 가지 기능 거울을 강조한다 :

  1. 계층화 된 미러 ( Layer)이다, 즉, 복수의 중간층이 이미지 될 수 동일한 중간층을 공유 할 수있는 복수의 미러는 또한 거울의 새로운 이미지를 생성하는 단계를 추가 할 수있다.

  2. 미러링은 읽기 전용 ( read-only) : 내장 된 미러링 후, 그들은 더 이상 수정할 수 없으며, 우리가 일시적으로 증가를 만들거나 용기에 실제로 용기의 중간 인 새로운 이미지를 구축하는 얘기 위의 레이어를 추가 할 수 있습니다 컨테이너가 동적으로 변경 될 수 있기 때문에, 새로운 이미지를 형성하기 위해, 파일을 삭제합니다.

다이어그램 다음, 나는 더 잘 이해 할 수 관계를 :Docker镜像Linux

미러 작업 명령

Docker상기 명령과 관련된 동작을 미러링 docker image하여 명령이 은색을 docker image --help명령 참조 docker image다음 상세한 설명서 하위 명령 :

Usage:  docker image COMMAND

Manage images

Commands:
  build       Build an image from a Dockerfile(构建镜像的命令)
  history     Show the history of an image(显示镜像构建历史过程)
  import      Import the contents from a tarball to create a filesystem image(导入一个由容器导出的镜像)
  inspect     Display detailed information on one or more images(显示一个镜像的详细信息)
  load        Load an image from a tar archive or STDIN(从一个文件或标准输入流中导入镜像)
  ls          List images(查看镜像列表)
  prune       Remove unused images(删除虚悬镜像)
  pull        Pull an image or a repository from a registry(从仓库拉取镜像)
  push        Push an image or a repository to a registry(推送镜像到仓库)
  rm          Remove one or more images(删除镜像)
  save        Save one or more images to a tar archive (streamed to STDOUT by default)(保存镜像到文件)
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE(给镜像打标签)
复制代码

거울을 받기

설치 Docker후, 우리는하지만, 더 편리 또는에서, 물론, 우리는 자신을 구축 할 수 있습니다, 로컬 미러링이없는 Docker공식에 의해 제공 창고 서비스 Docker Hub좋은 이미지를 구축 공식 또는 타사에 풀.

거울을 잡아 당기면 사용할 수 있습니다 docker image pull다음과 같은 형식 :

docker image pull [OPTIONS] NAME[:TAG|@DIGEST]
复制代码

물론, docker image pull더 간결하고 사용이있다 : 예를 들면 :

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
复制代码

미러링을 당겨하려면 지정해야 Docker Registry하는 URL 및 포트 번호를 기본값은 Docker Hub도 지정해야 仓库名거울을 확인하고 라벨, 창고의 이름과 고유 라벨, 태그는. 생략 할 경우, 기본 사용을 생략 할 가능성이 latest레이블 이름 및 저장소 이름 저자의 이름과 소프트웨어 구성 요소의 이름으로.

우리가 끌어 싶습니다 그래서, 그래서 생략 매개 변수 후, 같은은 centos미러를, 당신은 다음과 같은 간단한 명령을 사용할 수 있습니다 Docker Hub풀 :

$ docker pull centos
复制代码

로컬 미러를 확인

우리는 로컬 미러로 끌어 위의 방법을 통해, 그것은 무엇 지역 미러링까지 얼마나 볼 수? 우리는 모든 로컬 미러링을 보려면 다음 명령을 사용할 수 있습니다 :

$ docker image ls
复制代码

물론, Docker다음과 같이 좀 더 간결한 표현을 제공합니다 :

$ docker images
复制代码
매달려 거울

우리는 알고 Docker미러 이름 仓库名标签구성을, 그러나 때때로 우리는 저장소의 이름과 레이블이 모두 볼 수 <none>우리는이 이미지는 전화, 미러링 虚悬镜像다음과 같이 :

虚悬镜像우리가 사용할 때 일반적으로 docker pull시간이 때문에, 거울, 그 결과 새로운 이미지를 당겨 仓库名标签새 미러를 준 오래된 창고 레이블이되고, 취소 된 거울 虚悬镜像.

우리는 다음과 같은 성명을 인쇄를 모두 사용할 수 있습니다 虚悬镜像:

$ docker image ls -f dangling=true
复制代码

일반 매달려 거울은 청소 할 수 있도록 다음 명령은 모든 매달려 거울을 지울 수, 영향을주지 않습니다 :

$ docker image prune
复制代码

우리는 몇 가지 유용한 가상 이미지를 유지하려는 경우, 당신은 사용할 수있는 docker tag창고의 이름과 라벨의 거울에 명령을 다시 :

$ docker tag 621d57f27e93 "test:1.0"
复制代码

수출 및 수입 이미지

다른 사람과 거울을 공유하려는 경우 떨어져있는 미러 서비스 창고에서 pull거울과 거울을 push다음과 같이 창고 넘어 갈, 사실, 우리는 또한 좋은 로컬 미러 직접 수출하고 다른 사람에게 보낼 파일로 저장을 구축 할 수 있습니다 :

$ docker image save /tmp/test_image.tar.gz
复制代码

이미지 파일을 내보낼 다른 사람을 얻을 때, 당신은 사용할 수있는 docker load로컬에 이미지를로드하는 명령을 Docker다음과 같이 미러 목록 :

$ docker load < /tmp/test_image.tar.gz
复制代码

로컬 미러 삭제

하나 개 이상의 로컬 미러를 삭제하려면 다음 명령을 사용할 수 있습니다 :

docker image rm [option] IMAGE1,IMAGE2,...IMAGEn
复制代码

당신은 또한 같은 좀 더 간결한 방법을 사용할 수 있습니다 :

docker rmi  [option]  IMAGE1,IMAGE2,...IMAGEn
复制代码

다음과 같이, 미러를 제거하기 위해 짧은 ID, 요약 및 미러 이미지 이름을 미러링, 거울 긴 ID를 사용할 수 있습니다

$ docker rmi f7302e4ab3a8
复制代码

같은 보통 일반적인 거울 짧은 ID :

$ docker rmi f7302
复制代码

또한 미러를 제거 할 수 있습니다 요약 미러링, 미러 요약 쿼리에 다음 명령을 사용할 수 있습니다 :

$ docker image ls --digests
复制代码

물론, 우리는 모든 로컬 미러를 삭제하려면, 다음 명령을 사용할 수 있지만, 일반적으로 권장되지 않습니다.

$ docker rmi $(docker images -qa)
复制代码

미러가 컨테이너를 만드는 데 사용 된 경우 또한, 일반적으로 삭제할 수 없습니다, 그것은 이미지가 사용 된 것을 우리에게 알려줍니다, 다음과 같은 오류가보고됩니다 삭제하려면 위의 명령을 사용합니다.

Error response from daemon: conflict: unable to remove repository reference "mysql:5.7" (must force) - container ccd406c07a78 is using its referenced image e1e1680ac726
复制代码

거울은, 첫 번째는 컨테이너 삭제 한 다음 단지 명령에 거울을 제거 할 필요없이 다른 미러를 제거하고 삭제하는 방법은 두 가지가있다, 컨테이너의 건설에 사용 된 -f예를 들어, 매개 변수가 될 수는 :

$ docker rim -f f7302
复制代码

거울을 구축 커밋 고정 표시기를 사용하여

위의 예제는 직접 매장 외부 창고 또는 기타 공식 미러에서 좋은 이미지를 구축하기 위해 다른 사람을 끌어 이외에, 사실, 공식을 미러링, 우리는 또한 당신의 자신의 이미지를 구축 할 수 있습니다, 일반적으로 구축하는 방법에는 두 가지가 있습니다.

사용 docker commit명령을, 우리는 다음과 같은 거울로 수정 된 컨테이너를 다시 제출할 수 있습니다 :

$ docker commit conntaner_id my-hello:1.0
复制代码

이 방법을 구축 미러링, 우리라는 블랙 박스 미러 , 블랙 박스와 같은 우리가하고 컨테이너 운영에 어떤 변화가 모르는 다른 사람을, 그것의 안전에 대해 질문 할 것이다.

거울을 구축하는이 방법을 사용의 좀 더 다양하고 편리한 방법을 소개하자하지 않는 것이 좋습니다.

사용 Dockerfile미러를 구축

그것은 준비하는 것이 좋습니다 Dockerfile거울을 구성, Docker Hub거울에이 방법을 구축,이 방법을 사용하는 이점은 우리가 다른 사람에 이미지를 배포 만에 없다는 것입니다 Dockerfile및 데이터를 대응하는 문제를 미러링 작성해야 다른 사람, 그들은 안전하고 투명 자신의 거울을 구축 할 수 있습니다.

간단한 프로그램을 작성있어
package main
import "fmt"

func main(){
    fmt.Println("Hello Go")
}
复制代码

Go프로그램은 같은 실행 프로그램으로 컴파일 :

$ go build hello.go
复制代码
쓰기 Dockerfile파일

의 간단한 쓰기하자 Dockerfile다음과 같이 문서를 첫 번째 이미지를 구축 :

# 从一个空白的镜像开始
FROM stratch
ADD hello /
# 执行
CMD /hello
复制代码
거울을 구축 시작

쓰기 좋은 Dockerfile파일을 사용하는 docker build명령 건물을, docker build다음과 같은 형식의 명령은 다음과 같습니다

$ docker build [OPTIONS] PATH | URL | -
复制代码
# 注意最后的点(.)表示当前目录,即Dockerfile所在的目录
$ docker build -t "hello-go:1.0" .
复制代码

위는 단지의 사용을 보여줍니다 Dockerfile에 거울을 구축하는 방법 파일 Dockerfile, 우리는 유기에 대해 얘기, 더 많은 심층 사용이됩니다.

컨테이너 (컨테이너)

그냥 용기 미러 프로그램 객체 클래스 및 관계의 관계에 관해서.

컨테이너가이 컨테이너를 만들 수있는 거울이 있어야하므로, 미러링에 의해 생성되기 때문에, 컨테이너는 호스트의 분리 과정을 독립적으로 생성되며, 자체 네트워크와 네임 스페이스에 속하는 컨테이너가있다.

용기 층을 하나의 리더 첨가 때문에 읽기 전용 생성 된 이미지로 구성된 중간 층 (레이어)의 복수의 미러, 앞서 소개하지만, 용기가 판독 및 기록 가능하다,이 저자는 상기 미러링 (인 아래와 같이 읽기 / 층), 실행 :

명령 용기의 조작에 관한

Usage:  docker container COMMAND

Manage containers

Commands:
  attach      Attach local standard input, output, and error streams to a runnin                                                                                             g container
  commit      Create a new image from a container's changes(把容器保存为镜像)
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container(创建一个新的容器)
  diff        Inspect changes to files or directories on a container's filesyste                                                                                             m
  exec        Run a command in a running container(在一个运行的容器中执行命令)
  export      Export a container's filesystem as a tar archive
  inspect     Display detailed information on one or more containers
  kill        Kill one or more running containers(杀死一个或多个正在运行的容器)
  logs        Fetch the logs of a container
  ls          List containers(显示本地容器列表)
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  prune       Remove all stopped containers
  rename      Rename a container(重命名容器)
  restart     Restart one or more containers(重启一个或多个容器)
  rm          Remove one or more containers(删除一个或多个容器)
  run         Run a command in a new container(运行一个新的容器)
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers(停止一个或多个容器)
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  wait        Block until one or more containers stop, then print their exit codes
复制代码

컨테이너를 시작합니다

여러 가지 방법으로 컨테이너를 시작, 가장 일반적인 방법은 사용하는 것 docker run같은 거울을 통해 컨테이너를 생성하는 명령을 :

# /bin/bash表示运行容器后要执行的命令
$ docker run -it centos /bin/bash
复制代码

docker run같은 컨테이너로 더 일반적으로 사용되는 매개 변수 중 일부는 서비스를 제공하는 데몬 명령, 그것은 일반적으로 다음과 같은 외부 액세스를위한 열린 포트가 필요합니다

$ docker run -p 80:80 nginx
复制代码

또한 같은 컨테이너의 이름을 지정할 수 있습니다 :

$ docker run -p 80:80 --name webserver nginx
复制代码

또 다른는 사용하는 docker start등, 실행 중지 컨테이너를 다시 시작 명령을 :

# container_id表示容器的id
$ docker start container_id
复制代码

컨테이너가 실행에 관해서는, 당신은 할 수 docker restart와 같은 명령을 다시 시작합니다

# container_id表示容器的id
$ docker restart container_id
复制代码

지역의 용기 목록보기

컨테이너를 실행 한 후, 다음 명령으로 모든 지역의 컨테이너를 볼 수 있습니다

$ docker container ls
复制代码

그러나 docker container ls또한 간결한 문구 :

$ docker ps
复制代码

다음 상기 명령의 실행 결과는 :

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
f4f184f5ffb9        redis:latest        "docker-entrypoint.s…"   6 seconds ago       Up 4 seconds        0.0.0.0:6379->6379/tcp              myredis
f7d970e7d4ce        mysql:5.7           "docker-entrypoint.s…"   7 seconds ago       Up 5 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   docker-mysql
复制代码

당신은, 실행의 폐기, 당신은 매개 변수를 추가 할 수있는 모든 컨테이너를 표시 할 경우에는, 위의 명령은 디스플레이 컨테이너는 실행중인 것 -a등을 :

$ docker ps -a
复制代码

때때로, 우리가 용기에서 발견 된 ID에 설치하려는 경우에는 다음 명령을 사용할 수 있습니다 :

$ docker ps -aq
复制代码

결과

f4f184f5ffb9
f7d970e7d4ce
复制代码

컨테이너를 중지

, 할 수있는 컨테이너에 대한 필요가 없습니다 docker stop명령은 같은 동작을 중지 :

$ docker stop container_id1,container_id2...
复制代码

같은 대량 컨테이너를 중지

$ docker stop $(docker ps -qa)
复制代码

선박의 세 가지 작동 모드

요약하면, Docker다음과 같이 컨테이너는 일반적으로 세 가지 작동 모드가 있습니다 :

종료를 실행 한 후

다음 문이 종료를 실행 한 후, 컨테이너를 만듭니다.

$ docker run centos echo "hellowrold"
复制代码
영구 메모리는 데몬 모드입니다

데몬이 컨테이너에서 실행하는 경우, 컨테이너는 항상 같은 실행 될 것입니다 :

$ docker run -d -p 80:80 nginx
复制代码
대화

우리는 또한 컨테이너와 컨테이너, 직접적인 상호 작용에서 실행할 수 있습니다.

$ docker run -it centos /bin/bash
复制代码

컨테이너 삭제

$ docker container rm container_id
复制代码

다음과 같이 컨테이너 명령은 또한 간단한 문구입니다 삭제

$ docker rm container_id
复制代码

위의 하나는 컨테이너 수량을 중지 할 수 있습니다처럼, 우리는 또한 같은 배치 컨테이너를 삭제할 수 있습니다 :

$ docker rm $(docker ps -qa)
复制代码

컨테이너 속으로

실행중인 컨테이너, 우리는 또한 수의 경우 docker exec컨테이너를 입력 다시 같은 명령 :

$ docker exec -it f4f184f5ffb9 /bin/bash
复制代码

당신은 컨테이너 ID 나 이름, 우리가 ID를 사용 위의 명령을 지정해야합니다.

거울에 대한 수출 컨테이너

$ docker export -o ./image.tar.gz f4f184f5ffb9
复制代码

선박 수출 후, 우리는 추가로 장착 할 수 Docker있는 파일과 같은, 거울 패키지가 PC 가져 오기 :

$ docker import image.tar.gz
复制代码

위에서 언급 한 컨테이너의 개념과 용기에 일반적으로 사용되는 명령입니다, 당신은 또한 우리가 이야기 할 수있는 기회를 갖게 데이터 볼륨과 네트워크 공간을 설정할 수 있습니다.

웨어 하우스 (저장소)

웨어 하우스 ( Repository) 이미지를 저장하는 중앙 집중화 된 장소, 그 창고 및웨어 하우스 서버가 (무엇을 구분하는 개념이 Registry우리가 위에서 말한 것처럼) 두 개의 서로 다른 것들 Docker Hub입니다 Docker창고 공식 서버 있지만, 사실은, 때때로 우리는하지 않습니다 또한 우리는이 두 개념을 구분해야합니다.

공공 창고

일반적으로 공공 창고를 말한다 Docker Hub우리가에서 앞에 얼마나 많은 시간, Docker Hub이미지를 가져 오는, 거울을 얻기 이외에, 우리는 또한 저장되는 자신의 이미지를 구축 할 수 있습니다 Docker Hub다른 사람들이 우리가 구축 미러를 사용할 수 있습니다.

그러나 만약 당신이 이미지에 업로드하려면 Docker Hub, 먼저해야한다 Docker, 등록 인터페이스 다음, 공식 웹 사이트에 계정을 등록 매우 간단하고 등록하는 데 필요한 필요한 정보를 입력합니다.

음, 등록 후, 당신이 명령을 사용하여 로컬로 로그온 할 수 Dokcer Hub다음과 같이 프로세스는 다음과 같습니다

# 在命令行中输入
$ docker login
复制代码

에 로그인 할 수있는 계정 암호를 입력 Docker Hub한 후, 당신이 사용할 수있는 docker push미러를 밀어 명령을 Docker Hub.

$ docker push test:1.0
复制代码

개인 창고

그들이 직접 사용처럼, 너무 많은 문제를 수출하고 때로는 자신의 내부 부서는 거울의 일부를 공유하고, 거울은 다른 사람에게 보여 Docker Hub이 매우 편리하지 않습니다 공공 창고 우리가 저장하기 위해 자신의 자신의 개인 창고를 구축 할 수 있습니다,이 시간을 우리의 거울 및 유통.

Docker공식 제공 registry이 이미지를 다음과 같이, 창고 서비스를 구축 할 수있을 것입니다 컨테이너의 미러 이미지를 만들려면 다음 명령을 사용하여, 개인 창고를 구축하는 데 사용할 수 있으며, 우리는 로컬 미러링 뽑아 :

$ docker run -d -p 5000:5000 --restart=always --name registry registry
复制代码

우리가 하나의 IP를 넣어 가정 192.168.0.100창고 서비스로 서버, 그리고 위의 문을 실행, 우리는 같은 거울 위의 다음 문을 재구성 할 수 있습니다 :

$ docker build -t "192.168.0.100/hello-go:1.0" .
复制代码

그런 다음 자신의 개인 저장소 서버를 밀어 다음 문을 사용 :

$ docker push 192.168.0.100/hello-word:1.0
复制代码

개요

미러링이 건물은 더 이상 완료 후 정적 개념 수정할 수 없습니다, 용기가 역동적 인 개념이다, 사용은 Docker간단하게 할 수 있고 쉽게 만들거나 단지에서 객체 지향 프로그래밍과 클래스로, 용기와 용기, 거울 이미지 관계를 삭제 관계는 미러 창고 저장 및 배포 영역된다.


오신 것을 환영합니다 검색 코드에 관한 일반적인 학습 진행

추천

출처juejin.im/post/5d57c1b5f265da03dc076ba6