도커 & 설치 : Link

Get started Docker

도커 CLI 명령어 흝어보기

docker container --help
command explanation
attach 실행중인 컨테이너에 로컬 표준 입출력 및 오류의 스트림 연결
commit 컨테이너의 변경 사항으로부터 새로운 이미지를 만들어낸다.
cp 컨테이너와 로컬파일시스템 사이에서 파일 또는 폴더를 복사한다
create 새로운 컨테이너를 생성한다
diff 컨테이너의 파일시스템에서 파일이나 디렉토리의 변경을 검사
exec 실행중인 컨테이너에서 명령어를 실행한다
export Export a container’s filesystem as a tar archive
inspect 하나 이상의 컨테이너의 세부 사항을 보여준다
kill 실행중인 컨테이너를 종료
logs 컨테이너의 로그를 보여준다
ls 컨테이너 리스트
pause 하나 이상의 컨테이너의 모든 프로세스를 중지한다
port 컨테이너와 매핑된 포트들의 리스트
prune 정지되어있는 모든 컨테이너를 제거한다
rename 컨테이너 이름 바꾸기
restart 재시작
rm 하나 이상의 컨테이너 제거
run 새 컨테이너에서 명령어를 실행시킨다
start 하나 이상의 정지되어 있는 컨테이너를 시작한다
stats 컨테이너에서 사용하는 있는 자원의 통계를 표시
stop 하나 이상의 컨테이너를 중지시킨다.
top 컨테이너의 실행중인 프로세스를 보여준다
unpause 하나 이상의 컨테이너 내의 프로세스 일시 중지를 해제한다.
update 하나 이상의 컨테이너의 configuration을 업데이트한다
wait 하나 이상의 컨테이너가 멈출 때까지 차단한 다음 종료 코드를 출력

Dockerfile

도커 파일은 컨테이너 내부의 환경에서 일어나는 일을 정의한다. 네트워킹 인터페이스 및 디스크 드라이브 같은 리소스에 대해 접근하기 위해서는 컨테이너의 바깥쪽으로 포트를 매핑시켜야 하고 copy in하기를 원하는 파일을 명시해야한다. 그렇게 함으로써 도커파일은 실행시킬 때마다 동일하게 작동할 것이라는 것을 예상할 수 있다.

도커파일 정의해보기

mkdir test
cd test
vim Dockerfile

Dockerfile에 아래의 내용을 써준다.

# 파이썬 이미지 사용
FROM python:2.7-slim

# /app 폴더를 작업 폴더로 지정
WORKDIR /app

# 현재 디렉토리(test폴더)의 내용을 컨테이너의 /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"]

다음으로 Dockerfile에 명시한 requirements.txt와 app.py를 만들어보자. 이 파일을 만들어놔야 컨테이너에 복사할 것 아닌가

requirements.txt

Flask
Redis

여기서 명시된 것들은 위의 명령어로 인해 설치될 것이다.

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)

파이썬을 잘 모르지만 대충 “/” 경로에 접속하면 다음과 같은 html을 보여줄 것이고, return하는 부분에서 보니 Dockerfile에서 환경 변수로 만들었던 NAME을 사용하고 있다는 것을 알 수 있다. 또 레디스의 “counter”값을 증가시키는 것 같다.

자 일단 위의 사항들을 통해서 알 수 있었던 건 내가 직접 환경을 설정하기 위해 파이썬을 설치하고, 환경 변수를 설정하고, 레디스를 설치하고 , flask를 설치할 필요없이 도커파일에 명시함으로써 해결할 수 있었고 이 파일만 있다면 동일한 환경 구성을 구성할 수 있다는 것이다.

빌드하기

위에서 app을 빌드할 준비를 마쳤으니, 실제로 실행시켜보고 잘 돌아가는지 확인해보자.

아래 명령어는 도커이미지를 만들 때, friendlyhello라는 이름으로 만드는 것이다.

docker build --tag=friendlyhello .

성공적으로 실행이 되었다면

docker image ls

이미지 저장소에 friendlyhello를 이름을 가진 이미지를 볼수있게된다.

실행시키기

아래 명령어를 통해서 로컬의 4000포트를 컨테이너의 80포트와 매핑시키고 실행시켜보자. (-d 옵션은 detached mode)

docker run -d -p 4000:80 friendlyhello

이제 매핑된 주소와 포트로 접속하여 보자

중지시키기

docker container stop [container id]

컨테이너 id는 아래 명령어로 확인

docker container ls

이미지 업로드

방금 만든 이미지를 저장소에 업로드 시켜보자. 이미지를 업로드하기 위해서는 저장소에 아이디가 있어야 하는데 [hub.docker.com](https://hub.docker.com/ ) 이곳을 통해 만들어야한다. 아이디는 정말 금방 만든다… 회원가입이 되었으면 레포지토리도 하나 생성해 놓자.

docker login

이후에 id패스워드를 입력해준다.

성공적으로 로그인이 되었으면 이제 이미지를 올릴차례이다. 여기서 로컬 이미지를 레지스트리의 리포지토리에 연결하기 위한 표기법은 유저이름/저장소:태그이다. 태그는 선택적인 옵션이다.

아래의 명령어를 통해 우선 아까전에 만든 이미지를 다음의 형식으로 만들ㅇ러 원하는 목적지로 이미지를 업로드할 수 있게 하자.

docker tag friendlyhello 유저명/레포지토리명:태그

새롭게 태그된 이미지를 확인해보자

docker image ls

이미지 푸시하기

태그된 이미지를 이제 원격레포지토리에 올려보자.

docker push 유저명/레포지토리명:태그

완료되었다면 도커허브에 접속하여 확인해보자.

원격 레포지토리에서 이미지 가져오기

docker run -p 4000:80 유저명/레포지토리:태그

이런식으로 이제 내가만든 이미지는 어디서든 다음과 같이 사용할 수 있게 되었다.

마치며

  • 도커의 장점을 실감했다.
  • Dockerfile의 문법적인 부분들을 더 알아야한다.
  • 다음 포스트에서 서비스에서 이 컨테이너를 실행하여 애플리케이션을 확하는 방법을 알아보도록 한다.