Docker Get Started - Container
도커 & 설치 : 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의 문법적인 부분들을 더 알아야한다.
- 다음 포스트에서 서비스에서 이 컨테이너를 실행하여 애플리케이션을 확하는 방법을 알아보도록 한다.