>  기사  >  Docker는 '엔티티 목록'에 제한되어 포함되어 있으므로 Docker가 왜 그렇게 중요한지 이야기해 보겠습니다.

Docker는 '엔티티 목록'에 제한되어 포함되어 있으므로 Docker가 왜 그렇게 중요한지 이야기해 보겠습니다.

青灯夜游
青灯夜游앞으로
2020-08-19 14:07:135365검색

뉴스:

8월 13일 Docker는 미국 "엔티티 목록"과 같은 여러 목록에 포함된 수출 금지 국가, 조직 및 개인이 Docker 웹 사이트 및 서비스를 준수하는 모든 관련 웹 사이트를 사용하는 것을 금지하는 웹 사이트 서비스 계약을 업데이트했습니다. 합의 .

여기에는 Huawei, Hikvision, Dahua Technology, iFlytek, Megvii Technology, SenseTime 및 기타 여러 기술 회사와 Harbin Institute of Technology 및 Harbin Engineering University와 같은 대학이 포함됩니다.

Docker는 엔티티 목록에 제한되어 포함되어 있으므로 Docker가 왜 그렇게 중요한지 이야기해 보겠습니다.

이 기사에서는 Docker의 신비한 세계를 탐험하고 Docker의 기본 원리와 실제 작동을 처음부터 끝까지 익히고 Docker가 왜 그렇게 중요한지 이해할 것입니다. [관련 권장 사항: Docker 비디오 튜토리얼]

리치 웹 시대에 애플리케이션은 점점 더 강력해지고 동시에 더욱 복잡해지고 있습니다. 클러스터 배포, 격리 환경, 그레이스케일 릴리스 및 동적 확장은 모두 필수이며 컨테이너화는 그 중간에 꼭 필요한 브리지가 되었습니다.

이야기를 들려주세요

Docker가 무엇인지 더 잘 이해하기 위해 먼저 이야기를 들려드리겠습니다.

집을 지어야 해서 돌을 옮기고, 나무를 자르고, 그림을 그리고, 집을 지었습니다. . 많은 노력 끝에 마침내 집이 지어졌습니다.

Docker는 엔티티 목록에 제한되어 포함되어 있으므로 Docker가 왜 그렇게 중요한지 이야기해 보겠습니다.

그러다 보니 그곳에서 한동안 살다가 갑자기 해변으로 이사가고 싶었어요. 이때는 이전 방법대로 해변에 가서 돌을 옮기고, 나무를 자르고, 그림을 그리고, 다시 집을 짓는 것밖에 할 수 없다.

Docker는 엔티티 목록에 제한되어 포함되어 있으므로 Docker가 왜 그렇게 중요한지 이야기해 보겠습니다.

제가 고민하고 있을 때 마술사님이 오셔서 마법을 가르쳐주셨어요. 이 마법은 내가 지은 집의 복사본을 만들어 '거울상'으로 만들어 배낭에 넣을 수 있다.

Docker는 엔티티 목록에 제한되어 포함되어 있으므로 Docker가 왜 그렇게 중요한지 이야기해 보겠습니다.

해수욕장에 도착하면 이 '거울'을 이용해 집을 복사해서 입주하겠습니다.

정말 놀랍지 않나요? 우리 프로젝트에 대응하여 집은 프로젝트 그 자체이고, 거울은 프로젝트의 복사본이며, 배낭은 거울 창고입니다.

용량을 동적으로 확장하고 싶다면 창고에서 프로젝트 이미지를 꺼내어 원하는 대로 복사하면 됩니다. 한번 빌드하면 어디서든 실행 가능

"온라인에서 한 번 충돌하고 끝없이 빌드되는" 당황스러움을 완전히 해결합니다.

가상 머신 및 컨테이너

시작하기 전에 몇 가지 기본 지식을 준비합시다.

①가상 머신: 가상화 하드웨어

가상 머신 가상 머신은 완전한 소프트웨어 시뮬레이션을 의미합니다. 하드웨어 시스템으로 작동하며 완전히 격리된 환경에서 실행됩니다. 물리적 컴퓨터에서 수행할 수 있는 모든 작업을 가상 컴퓨터에서도 수행할 수 있습니다.

컴퓨터에서 가상 머신을 생성할 때 물리적 머신의 하드 드라이브 및 메모리 용량 중 일부를 가상 머신의 하드 드라이브 및 메모리 용량으로 사용해야 합니다.

각 가상머신은 독립적인 CMOS, 하드디스크, 운영체제를 갖고 있으며, 가상머신은 물리머신처럼 동작할 수 있습니다. 컨테이너 기술 이전에 업계에서 가장 큰 영향력을 행사한 것은 가상 머신이었습니다.

가상머신 기술의 대표적인 것이 VMWare와 OpenStack입니다.

②컨테이너: 운영 체제 계층을 가상화하고 표준 소프트웨어 단위입니다

기능은 다음과 같습니다.

  • 어디서나 실행: 컨테이너는 구성 파일 및 관련 종속 라이브러리와 함께 코드를 패키징할 수 있으므로 일관된 작동을 보장합니다. 어떤 환경에서도.

  • 높은 리소스 활용도: 컨테이너는 프로세스 수준 격리를 제공하므로 CPU 및 메모리 사용량을 보다 세부적으로 설정할 수 있으므로 서버의 컴퓨팅 리소스를 더 잘 활용할 수 있습니다.

  • 빠른 확장: 각 컨테이너는 별도의 프로세스로 실행될 수 있으며 기본 운영 체제의 시스템 리소스를 공유할 수 있으므로 컨테이너 시작 및 중지 효율성을 높일 수 있습니다.

3차이점 및 연결:

  • 가상 머신은 많은 "하위 컴퓨터"를 격리할 수 있지만 더 많은 공간을 차지하고 더 느리게 시작됩니다. VMWare와 같은 가상 머신 소프트웨어에는 비용이 들 수도 있습니다.

  • 컨테이너 기술은 운영 체제 전체를 가상화할 필요는 없고 "샌드박스"와 유사한 소규모 환경만 가상화하면 됩니다.

  • 실행 공간, 가상 머신에는 일반적으로 몇 GB에서 수십 GB의 공간이 필요한 반면, 컨테이너에는 MB 또는 심지어 KB 수준만 필요합니다.

비교 데이터를 살펴보겠습니다.

Docker는 엔티티 목록에 제한되어 포함되어 있으므로 Docker가 왜 그렇게 중요한지 이야기해 보겠습니다.

가상 머신은 가상화 기술인 반면 Docker와 같은 컨테이너 기술은 경량 가상화입니다.

가상 머신에 비해 컨테이너는 Linux 기본 운영 체제를 활용하여 격리된 환경에서 실행되므로 더 가볍고 빠릅니다.

가상 머신의 하이퍼바이저는 애플리케이션이 위반하는 것을 방지하기 위해 매우 강력한 경계를 만드는 반면, 컨테이너의 경계는 그렇게 강력하지 않습니다.

Docker를 만나보세요

Docker는 엔티티 목록에 제한되어 포함되어 있으므로 Docker가 왜 그렇게 중요한지 이야기해 보겠습니다.

Docker는 개발자가 애플리케이션과 종속성을 휴대용 컨테이너에 패키징한 다음 널리 사용되는 Linux 시스템에 게시할 수 있는 오픈 소스 애플리케이션 컨테이너 엔진입니다. 가상화도 달성할 수 있습니다. 컨테이너는 샌드박스 메커니즘을 완전히 사용하며 서로 인터페이스가 없습니다.

Docker 기술의 세 가지 핵심 개념은 다음과 같습니다.

  • Image

  • Container Container

  • Warehouse Repository

Docker가 가벼운 이유는 무엇인가요? 저는 여러분도 다음과 같은 의문을 가질 것이라고 믿습니다. Docker가 왜 그렇게 빨리 시작됩니까? 커널을 호스트와 공유하는 방법은 무엇입니까?

Docker에 컨테이너 실행을 요청하면 Docker는 컴퓨터에 리소스 격리 환경을 설정합니다.

그런 다음 패키지된 애플리케이션과 관련 파일을 네임스페이스 내의 파일 시스템에 복사하면 환경 구성이 완료됩니다. 그런 다음 Docker는 미리 지정한 명령을 실행하여 애플리케이션을 실행합니다.

이미지에는 동적 데이터가 포함되어 있지 않으며 이미지가 구축된 후에도 콘텐츠가 변경되지 않습니다.

핵심 개념

핵심 개념은 다음과 같습니다.

  • Build, Ship and Run(빌드, 운송, 실행).

  • 한 번 빌드하면 어디서나 실행됩니다.

  • Docker 자체는 컨테이너가 아니며, 컨테이너 생성을 위한 도구이자 애플리케이션 컨테이너 엔진입니다.

  • Docker의 세 가지 핵심 개념은 이미지, 컨테이너 및 저장소입니다.

  • Docker 기술은 Linux 커널과 Cgroup, 네임스페이스 등의 커널 기능을 사용하여 프로세스를 분리하여 서로 독립적으로 실행할 수 있도록 합니다.

  • 네임스페이스 및 Cgroups 기능은 Linux에서만 사용할 수 있으므로 컨테이너는 다른 운영 체제에서 실행될 수 없습니다. 그렇다면 Docker는 macOS나 Windows에서 어떻게 실행되나요? Docker는 실제로 트릭을 사용하여 Linux가 아닌 운영 체제에 Linux 가상 머신을 설치한 다음 가상 머신 내부에서 컨테이너를 실행합니다.

  • 이미지는 애플리케이션을 실행하는 데 필요한 코드, 런타임, 라이브러리, 환경 변수 및 구성 파일을 포함하는 실행 가능한 패키지입니다.

Docker의 원리에 대한 자세한 내용은 여기서 설명하지 않는 "Docker 작동 원리 및 컨테이너화 간단한 가이드"를 확인하세요.

http://dockone.io/article/8788

Docker 설치

1명령줄 설치

Homebrew's Cask는 이미 Mac용 Docker를 지원하므로 Homebrew Cask를 사용하여 쉽게 설치할 수 있습니다. 다음 명령을 실행하세요.

brew cask install docker

더 많은 설치 방법을 확인하세요. 공식 문서 :

https://www.docker.com/get-started

②버전 보기

명령은 다음과 같습니다.

docker -v

3이미지 가속 구성

Docker 엔진 쓰기 구성 설정 :

{
  registry-mirrors: [
    http://hub-mirror.c.163.com/,
    https://registry.docker-cn.com
  ],
  insecure-registries:[],
  experimental: false,
  debug: true
}

4데스크톱 버전 설치

Docker는 엔티티 목록에 제한되어 포함되어 있으므로 Docker가 왜 그렇게 중요한지 이야기해 보겠습니다.

데스크톱 버전은 조작이 매우 간단합니다. 먼저 공식 웹사이트에 가서 [1]을 다운로드하세요. Docker 데스크탑을 통해 다음 작업을 쉽게 수행할 수 있습니다.

  • clone: ​​프로젝트를 복제합니다.

  • build: 이미지를 패키징합니다.

  • run: 인스턴스를 실행합니다.

  • 공유: 이미지를 공유합니다.

자, 준비가 끝났으니 이제 실력을 뽐내보세요!

빠른 시작

Docker를 설치한 후 먼저 실제 프로젝트의 이미지를 만들어 사용하면서 학습합니다.

①먼저 사용할 11개 명령어에 대한 전반적인 이해가 필요합니다

아래와 같이

Docker는 엔티티 목록에 제한되어 포함되어 있으므로 Docker가 왜 그렇게 중요한지 이야기해 보겠습니다.

②새 프로젝트 만들기

속도를 위해 직접 사용합니다. 프로젝트 빌드를 위한 Vue 스캐폴딩:

vue create docker-demo

시작해 보세요:

yarn serve

액세스 주소: http://localhost:8080/. 프로젝트가 준비되면 프로젝트를 패키징합니다.

yarn build

이때 프로젝트 디렉터리의 Dist는 배포하려는 정적 리소스이며 다음 단계를 계속합니다.

참고: 프런트 엔드 프로젝트는 일반적으로 두 가지 범주로 나누어집니다. 하나는 Nginx를 직접 사용하는 정적 배포이고 다른 하나는 Node 서비스를 시작해야 합니다. 이 섹션에서는 첫 번째 유형만 고려합니다. Node 서비스에 대해서는 나중에 자세히 설명하겠습니다.

③新建 Dockerfile

命令如下:

cd docker-demo && touch Dockerfile

此时的项目目录如下:

.
├── Dockerfile
├── README.md
├── babel.config.js
├── dist
├── node_modules
├── package.json
├── public
├── src
└── yarn.lock

可以看到我们已经在 docker-demo 目录下成功创建了 Dockerfile 文件。

④准备 Nginx 镜像

运行你的 Docker 桌面端,就会默认启动实例,我们在控制台拉取 Nginx 镜像:

docker pull nginx

控制台会出现如下信息:

Using default tag: latest
latest: Pulling from library/nginx
8559a31e96f4: Pull complete
8d69e59170f7: Pull complete
3f9f1ec1d262: Pull complete
d1f5ff4f210d: Pull complete
1e22bfa8652e: Pull complete
Digest: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

如果你出现这样的异常,请确认 Docker 实例是否正常运行。

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

镜像准备 OK,我们在根目录创建 Nginx 配置文件:

touch default.conf

写入:

server {
    listen       80;
    server_name  localhost;
    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;
    error_log  /var/log/nginx/error.log  error;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

⑤配置镜像

打开 Dockerfile ,写入如下内容:

FROM nginx
COPY dist/ /usr/share/nginx/html/
COPY default.conf /etc/nginx/conf.d/default.conf

我们逐行解释一下代码:

  • FROM nginx 指定该镜像是基于 nginx:latest 镜像而构建的。

  • COPY dist/ /usr/share/nginx/html/ 命令的意思是将项目根目录下 dist 文件夹中的所有文件复制到镜像中 /usr/share/nginx/html/ 目录下。

  • COPY default.conf /etc/nginx/conf.d/default.conf 将 default.conf 复制到 etc/nginx/conf.d/default.conf,用本地的 default.conf 配置来替换 Nginx 镜像里的默认配置。

⑥构建镜像

Docker 通过 build 命令来构建镜像:

docker build -t jartto-docker-demo .

按照惯例,我们解释一下上述代码:

  • -t 参数给镜像命名 jartto-docker-demo。

  • . 是基于当前目录的 Dockerfile 来构建镜像。

执行成功后,将会输出:

Sending build context to Docker daemon  115.4MB
Step 1/3 : FROM nginx
 ---> 2622e6cca7eb
Step 2/3 : COPY dist/ /usr/share/nginx/html/
 ---> Using cache
 ---> 82b31f98dce6
Step 3/3 : COPY default.conf /etc/nginx/conf.d/default.conf
 ---> 7df6efaf9592
Successfully built 7df6efaf9592
Successfully tagged jartto-docker-demo:latest

镜像制作成功!我们来查看一下容器:

docker image ls | grep jartto-docker-demo

可以看到,我们打出了一个 133MB 的项目镜像:

jartto-docker-demo latest 7df6efaf9592 About a minute ago 133MB

镜像也有好坏之分,后续我们将介绍如何优化,这里可以先暂时忽略。

⑦运行容器

命令如下:

docker run -d -p 3000:80 --name docker-vue jartto-docker-demo

这里解释一下参数:

  • -d 设置容器在后台运行。

  • -p 表示端口映射,把本机的 3000 端口映射到 container 的 80 端口(这样外网就能通过本机的 3000 端口访问了。

  • --name 设置容器名 docker-vue。

  • jartto-docker-demo 是我们上面构建的镜像名字。

补充一点:在控制台,我们可以通过 docker ps 查看刚运行的 Container 的 ID:

docker ps -a

控制台会输出:

CONTAINER ID IMAGE              COMMAND                  CREATED       STATUS PORTS  NAMES
ab1375befb0b jartto-docker-demo /docker-entrypoint.…   8 minutes ago Up 7 minutes  0.0.0.0:3000->80/tcp  docker-vue

如果你使用桌面端,那么打开 Docker Dashboard 就可以看到容器列表了,如下图:

Docker는 엔티티 목록에 제한되어 포함되어 있으므로 Docker가 왜 그렇게 중요한지 이야기해 보겠습니다.

⑧访问项目

因为我们映射了本机 3000 端口,所以执行:

curl -v -i localhost:3000

或者打开浏览器,访问:localhost:3000。

⑨发布镜像

如果你想为社区贡献力量,那么需要将镜像发布,方便其他开发者使用。

发布镜像需要如下步骤:

  • 登陆 dockerhub[2],注册账号。

  • 命令行执行 docker login,之后输入我们的账号密码,进行登录。

  • 推送镜像之前,需要打一个 Tag,执行 docker tag /:

全流程结束,以后我们要使用,再也不需要「搬石头、砍木头、画图纸、盖房子」了,拎包入住。这也是 Docker 独特魅力所在。

常规操作

到这里,恭喜你已经完成了 Docker 的入门项目!如果还想继续深入,不妨接着往下看看。

①参数使用

FROM:

  • 指定基础镜像,所有构建的镜像都必须有一个基础镜像,且 FROM 命令必须是 Dockerfile 的第一个命令

  • FROM [AS ] 指定从一个镜像构建起一个新的镜像名字

  • FROM [:] [AS ] 指定镜像的版本 Tag

  • 示例:FROM mysql:5.0 AS database

MAINTAINER:

  • 镜像维护人的信息

  • MAINTAINER

  • 示例:MAINTAINER Jartto Jartto@qq.com

RUN:

  • 构建镜像时要执行的命令

  • RUN

  • 示例:RUN [executable, param1, param2]

ADD:

  • 로컬 파일을 컨테이너에 추가하고 복사하면 압축된 패키지가 압축 해제되며 네트워크의 파일에 액세스하여 자동으로 다운로드할 수 있습니다.

  • ADD

  • 예: ADD * .js /app 컨테이너의 앱 디렉터리에 js 파일을 추가합니다

COPY:

  • 기능은 ADD와 동일하며 복사만 하고 파일의 압축을 풀거나 다운로드하지 않습니다

CMD:

  • 컨테이너 시작 후 실행되는 명령은 이미지 빌드 시 실행되는 명령인 RUN과 다릅니다.

  • docker run을 사용하여 컨테이너를 실행할 때 이 명령을 재정의할 수 있습니다. 명령줄에서

  • 예: CMD [executable, param1, param2]

ENTRYPOINT:

  • 도 CMD와 마찬가지로 실행 명령입니다. 단, 이 명령은 다음에 의해 덮어쓰여지지 않습니다. 명령줄

  • ENTRYPOINT [executable, param1, param2]

  • 예: ENTRYPOINT [donnet, myapp.dll]

LABEL: 키-값 형식으로 이미지에 메타데이터 추가

  • LABEL = ENV 한 번에 하나의 환경 변수 설정

  • ENV = key>= = 여러 환경 설정 변수

예: ENV JAVA_HOME /usr/java1.8/

  • EXPOSE: 외부에 노출된 포트( 컨테이너 내부의 프로그램 포트는 호스트와 동일하지만 실제로는 두 개의 포트입니다)

  • EXPOSE

  • 예: EXPOSE 80

컨테이너가 실행 중일 때 , 컨테이너의 포트에 액세스하려면 -p를 사용하여 외부 포트를 매핑해야 합니다

  • VOLUME: 데이터 지속성 지정 디렉토리, 공식 언어는 Mounting

  • VOLUME /var/log가 컨테이너에 마운트해야 하는 디렉터리이며, 이 디렉터리는 데이터 지속성과 동기화를 달성하기 위해 호스트의 임의 디렉터리에 매핑됩니다

  • VOLUME [/var/log,/var/test.....] 마운트해야 하는 컨테이너의 여러 디렉터리를 지정하고 이러한 디렉터리를 호스트의 여러 임의 디렉터리에 매핑하여 데이터 지속성과 동기화를 달성합니다.

VOLUME /var/data var/log는 var/log 디렉터리를 지정합니다. 호스트의 /var/data 디렉터리에 마운트할 컨테이너입니다. 이 형식에서는 호스트의 디렉터리를 수동으로 지정할 수 있습니다

  • WORKDIR: 설정 후 RUN, CMD의 작업 디렉터리를 설정합니다. , COPY, ADD가 동시에 변경됩니다

  • WORKDIR

  • 예: WORKDIR /app/test

USER: 명령을 실행할 때 사용할 사용자를 지정합니다. 보안 및 권한을 위해 실행할 명령에 따라 다른 사용자를 선택하세요

  • USER :[]

  • 예: USER test

ARG: 매개변수 설정 이미지 빌드에 전달됩니다

  • ARG [=]

  • ARG name=sss

더 많은 작업은 공식 문서 [3]로 이동하세요.

  • https://docs.docker.com/

  • Best Practices

Docker의 일반적인 작업을 익힌 후에는 원하는 프로젝트에 Mirror를 쉽게 입력할 수 있습니다.

그러나 다양한 작업으로 생성되는 이미지도 매우 다릅니다. 미러링 차이의 정확한 원인은 무엇입니까? 계속해서 살펴보겠습니다.

다음은 Docker 애플리케이션의 모범 사례입니다. 다음 지침을 따르십시오.

명확성 요구: 필요한 이미지입니다. 단계 간소화: 변경 사항이 적은 단계가 우선순위를 갖습니다.

클리어 버전: 이미지 이름이 명확하게 지정되어 있습니다.

    문서: 전체 이미지 패키징 단계를 재현할 수 있습니다.
  • 요약

  • 컨테이너화 기술은 클라우드 시대에 꼭 필요한 기술 중 하나가 될 것이며 Docker는 바다의 한 방울에 불과합니다. 이와 함께 클러스터 컨테이너 관리 Kubernetes, Service Mesh 및 Istio와 같은 기술이 제공됩니다.

    도커의 문을 열고, 계속해서 고치를 벗겨내고, 한 겹 더 깊이 들어가다 보면 컨테이너화의 무한한 매력을 느낄 수 있을 것입니다.

    관련 링크:

    • https://www.docker.com/products/docker-desktop

    • https://hub.docker.com/

    • https://docs. docker.com/

    원본 주소: http://jartto.wang/2020/07/04/learn-docker

    저자: jartto

    더 많은 관련 지식을 알고 싶다면 다음을 방문하세요. Docker 사용법 튜토리얼 ! !

성명:
이 기사는 weixin에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제