기초에서 이해하는 Docker
개시하다
업무에서 사용하는 Docker의 구조와 정체성 등 기초적인 이해를 이해하고자 총결산을 해봤습니다.
내용의 경우 앞부분은 이론적인 것을 가볍게 표현하고 뒷부분은 공식적인 튜토리얼을 소재로 실제 현지에서 Docker를 움직이면서 동작을 한다.
key
value
개발자
Docker, Inc.
공식 사이트
Empowering App Development for Developers | Docker
GitHub
docker/docker-ce
프로그래밍 언어
Go
대응 OS
Linux/macOS/Windows
독자 대상
Docker 소개
결론적으로 말하면Docker는'용기형 가상화 기술'을 활용해 응용프로그램을 개발·활용하는 플랫폼이다.
갑자기'용기형 가상화 기술'이라는 단어가 등장했다.컴퓨터에 가상 환경을 자주 구축하기 때문에 많은 사람들이 가상화라는 단어를 들은 적이 있죠.그렇다면'용기형 가상화 기술'은 이전의 가상화와 무엇이 다를까.
지금까지의 가상화 기술, 그리고 컨테이너
이를 통해 PC(호스트 OS)에서 가상화 소프트웨어를 사용하여 고객 OS를 구성하는 전통적인 가상화와 Docker가 구현한 용기 가상화 기술을 비교함으로써 용기 가상화 기술을 이해할 수 있다.
일반 가상화
초진동기를 통해 인산선소 위에서 흑체를 이동한다.기본적으로 흑체당과 인산염의 자원을 공유한다.VirtualBox 등 가상화 도구를 많이 사용하면 시작하는 몬스터 편지에 실제 필요한 중간부품과 프로그램 라이브러리를 설정합니다.
컨테이너 가상화
한편, 용기형 가상화는 인산 커널을 활용해 Docker Engine에서 용기를 구축한다.용기의 과정과 사용자는 인산 아드레날린과 분리된 독립된 동작 때문에 인산 아드레날린에 검은 체를 세운 것과 같다.
또 운영체제를 혼자 준비할 필요가 없고 자원을 낭비하지 않기 때문에 동작이 경쾌하고 고속인 것도 특징이다.
컨테이너 해결 과제
그렇다면 기존 가상화와 비교해 구성이 어떻게 다른지 알고 컨테이너를 구체적으로 활용하면 즐거울 수 있다는 점에 주목해보자.조사를 많이 했다고 하는데 그중에 가장 중요한 것은환경 구축 과정 인코딩 및 공유 가능그건 엄청나게 크겠지.
기존의 가상 환경 구축에서 고객 OS에 들어간 후 프로그램 라이브러리와 중간부품을 설치해야 한다는 것을 상세히 설명한다.그 작업은 수동으로 명령을 내리는 것이기 때문에 오류와 버전의 차이가 발생할 수 있습니다.또 같은 개발팀 내 구성원 간에도 현지 환경에서 차이가 생길 수 있다.
다른 한편, Docker를 사용하여 컨테이너를 가상화할 때 컨테이너의 정의는 하나의 파일
Dockerfile
로 정의된다.개발진에서는 그 파일만 공유하면 주변에서 같은 환경을 만들 수 있어 유지보수성이 좋다.이 이야기는 개발뿐만 아니라 제품 제공에도 영향을 미친다.일반적으로 제품이 출시되면 검증 환경, 무대 환경, 공식 환경과 인프라를 준비한다.그러나 많은 개발자들은 개발 절차를 확정하더라도 검증 환경, 무대 환경에서 발생하지 않을 고장은 정식 환경에서만 발생한다는 경험을 가지고 있다.Docker를 사용하면 모든 환경에서 같은 용기가 작동하는 환경을 만들 수 있기 때문에 이론적으로 이런 현상이 발생하지 않는다.
실천하다
드디어 실사
Dockerfile
를 써서 운행해야 한다.이번에 사용된 소스 코드는 공식 튜토리얼[1]의 소스 코드를 직접 사용합니다.이번 목적은 기초를 이해하는 것이기 때문에 접촉만 하고 더 많은 것을 배우고 싶다면 반드시 잘 활용하세요.Hello world
어쨌든 Hello World부터 해볼게요.
# ローカルのマシンに docker が入っているか確認
$ docker --version
Docker version 19.03.8, build afacb8b
# `docker run`イコマンドでメージからコンテナを起動
$ docker run hello-world
# ローカルに指定したイメージがない場合は、docker hub より自動でインストールされる
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:d58e752213a51785838f9eed2b7a498ffa1cb3aa7f946dda11af39286c3db9a9
Status: Downloaded newer image for hello-world:latest
# イメージが作られ Hello world と出力された
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
# `docker image` コマンドでイメージの一覧を確認
$ docker image ls
REPOSITORY TAG IMAGE ID
hello-world latest bf756fb1ae65 1 minutes ago 13.3kB
# `docker ps` コマンドでプロセスを確認
$ docker ps --all
c0d1570f2fc2 hello-world "/hello" 8 minutes ago Exited (0) 8 minutes ago
디테일을 완전히 이해할 필요가 없기 때문에 여기서 Docker 이미지를 얻고 컨테이너를 가동하는 대체적인 절차를 잡는 것이 중요하다.Docker file 만들기
공식적으로 준비한 이미지를 사용자 정의합니다.이 경우 사용자 정의 내용을
Dockerfile
파일로 만들고 정의합니다.# 公式の Python がインストールされたベースイメージを利用
FROM python:2.7-slim
# コンテナ内の作業ディレクトリを /app に設定
WORKDIR /app
# 現在のディレクトリの内容を、コンテナ内の /app にコピー
COPY . /app
# requirements.txt で指定された必要なパッケージを全てインストール
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# ポート 80 番をコンテナの外でも利用可能に設定
EXPOSE 80
# 環境変数を定義
ENV NAME World
# コンテナ起動時に app.py を実行
CMD ["python", "app.py"]
다음에 용기에서 이동하는 프로그램으로 app.py
의 이름으로 파이톤 파일을 제작한다.from flask import Flask
from redis import Redis, RedisError
import os
import socket
# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis, counter disabled</i>"
html = "<h3>Hello {name}!</h3>" \
"<b>Hostname:</b> {hostname}<br/>" \
"<b>Visits:</b> {visits}"
return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
마지막으로 용기에 설치하려는 프로그램 라이브러리, 중간부품이 requirements.txt
에 기록된 텍스트 파일을 Docker file에서 참조합니다.Flask
Redis
준비하고 집행한다.# 現在このような状況になっている
$ ls
Dockerfile app.py requirements.txt
# 作った Dockerfile をビルドして、イメージを作成
# `--tag` オプション: イメージにタグを付与
$ docker build --tag=friendlyhello .
Sending build context to Docker daemon 5.12kB
Step 1/7 : FROM python:2.7-slim
...
略
...
Successfully built 8f74a6392754
Successfully tagged friendlyhello:latest
# ビルドが終わったら、一旦イメージの一覧を確認
$ docker image ls
REPOSITORY TAG IMAGE ID
hello-world latest bf756fb1ae65
friendlyhello latest 326387cea398
# イメージが作成されているのを確認できたらコンテナを起動
# `-d` オプション: コンテナをバックグラウンドで実行
# `-p` オプション: ポートの割り当てを指定
$ docker run -d -p 4000:80 friendlyhello
$ docker ps
명령을 통해 상태가 Up
로 바뀌면 용기가 안전하게 이동한다.브라우저로localhost:4000에 접근하면Helloworld와 내용 표시도 확인할 수 있습니다.Docker file, 제작
Docker イメージ
자신이 준비하고 싶은 프로그램의 실행 환경コンテナ
에서 이런 곳을 이동하면 대체로 완성된다.총결산
사이트 축소판 그림
각주
Orientation and setup | Docker Documentation ↩︎
Reference
이 문제에 관하여(기초에서 이해하는 Docker), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/ysmtegsr/articles/c60710c5af2725870158텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)