docker run -it -rm --name ubuntu1804 ubuntu:18.04 /bin/bash
ubuntu 18.04 image로 container 생성
docker run -dit -p 80:80 --name webserver nginx
nginx image로 webserver container 실행
docker exec -it webserver /bin/bash
webserver container에 /bin/bash 실행
docker run -dit --name linuxserver -e VAR1=Ubuntu18.04 -e VAR2=LinuxServer ubuntu:18.04
-e VAR1=Ubuntu18.04 : container 내 환경변수 설정
container 생성시 환경변수 등록이 필요하면 -e 옵션을 통해 개별적으로 환경변수 설정
또는 --env-file <파일명> 옵션을 통해 환경변수를 저장한 파일을 통해 설정 가능
docker run -dit -m 1g --rm --name linuxserver3 ubuntu:18.04
docker run -dit --cpu-shares 512 --rm --name linuxserver4 ubuntu:18.04
docker rm -f <container ID/이름>
동작 중인 container도 강제 삭제
docker container pause <container ID/이름>
docker pause <container ID/이름>
container 일시 중지
docker container unpause <container ID/이름>
docker unpause <container ID/이름>
container 일시 중지 해제
docker container inspect <container ID/이름>
container 세부 정보 확인
docker container inspect webserver | grep Pid
: inspect 결과에 대하여 pipe와 grep을 활용하여 검색
docker container inspect webserver --format "{{.State.Pid}}"
: --format 옵션을 이용하여 원하는 내용 검색; Pid 검색
docker container inspect webserver --format "{{.NetworkSettings.IPAddress}}"
: --format 옵션을 이용하여 원하는 내용 검색; IP 주소 검색
docker container logs <container ID/이름>
container log 정보 출력
파이썬 어플리케이션 작성
lotto.py
from random import shuffle
from time import sleep
gamenum = input('input lotto game number : ')
for i in range(int(gamenum)):
balls = [x+1 for x in range(45)]
ret = []
for j in range(6):
shuffle(balls)
number = balls.pop()
ret.append(number)
ret.sort()
print(f'lotto number {i+1:2} : ', end='')
print(ret)
sleep(1)
docker run -it -d --name python-run python
파이썬 인터프리터 환경의 container 실행
docker exec -it python-run bash
python-run container에 진입하여 shell 실행
docker cp lotto.py python-run:/
host에 있는 lotto.py 파일을 python-run container의 / 디렉토리에 복사
docker exec -it python-run python /lotto.py
python container에 진입하지 않고도 lotto.py 프로그램 실행
Node.js 어플리케이션 작성
app.js
var http = require('http');
var content = function(req, res) {
res.writeHead(200);
res.end('Docker Container - Node.js app');
};
var web = http.createServer(content);
web.listen(8080);
docker run -dit -p 80:8080 --name node-run node:16.17
Node.js 실행 환경의 container 실행
docker cp app.js node-run:/
app.js 파일을 node-run container의 / 디렉토리에 복사
docker exec -it node-run bash
node-run container에 bash를 실행하여 동작 확인
docker exec -it node-run node app
app.js 프로그램 실행
Docker Image는 container 생성 목적으로 사용
Docker hub를 통해 미리 작성된 Docker Image를 다운로드하여 사용하는 것이 일반적,
Docker hub에서 제공하는 Docker Image는 기본이 되는 image 제공
사용자가 원하는 형태의 image를 별도로 생성 가능, 필요시 registry를 통해 배포 가능
현재 동작중인 container를 활용하여 image 생성
docker commit <현재 동작중인 container ID/이름> <생성할 image 이름>
현재 동작중인 container를 이용하여 image 생성
명령이 성공하면 docker images 명령으로 image 확인
docker commit python-run lotto-python:0.1
python을 lotto.py 파일 실행하는 Docker Image 생성
docker run -it --rm lotto-python:0.1 python lotto.py
lotto.py 프로그램 실행 container 생성
docker image 생성, 즉 필요로 하는 개발 환경을 제공하기 위한 여러 명령 집합
Dockerfile, dockerfile 모두 가능하나 통상 Dockerfile 많이 사용,
별도의 형상/버전 관리 툴을 이용하여 관리
Dockerfile 명령어는 대소문자 구분 X but 가독성 위해 대문자로 기술
생성하려는 image의 base image 지정
설정된 기본 이미지에 패키지 업데이트, 각종 패키지 설치, 명령 실행 등 작성
1개 이상 작성 가능
생성된 Docker image를 container로 생성하여 실행할 때 실행되는 명령 기술
생성된 Docker Image를 container로 실행할 때 실행되는 명령
Host에 있는 파일을 Docker image에 복사하는 명령
container가 host 네트워크를 통해 들어오는 트래픽을 listening하는 포트와 프로토콜 지정
container 상에서 작업할 경로 전환을 위해 사용
docker build <Dockerfile 위치> -t [<사용자 ID>/]<docker image 이름>
Dockerfile을 이용하여 Docker image 생성 명령
ubuntu 배포판(base image)에 apache web server를 설치하고 계산기 web application을 실행하는 image 생성
# base image 지정
FROM ubuntu:18.04
# Apache web server 설치
RUN apt-get update && apt-get install -y apache2
# web service를 위한 프로그램 복사
COPY ./index.html /var/www/html
COPY ./calc.js /var/www/html
# 사용 포트 지정
EXPOSE 80
# 명령 실행
CMD [ "/usr/sbin/apache2ctl", "-DFOREGROUND" ]
Docker Image 생성 실습 마지막 단계에서
docker: Error response from daemon:
driver failed programming external connectivity on endpoint calc-web
(b88ccebb343ab6ebf5e421feec69d3619856323e38ace3841b0795f3e3fdde1c):
Bind for 0.0.0.0:80 failed: port is already allocated.
라는 에러 메세지와 함께 정상적인 실행이 불가능 했었다. docker ps -a로 확인해보니 이미 node.js 컨테이너가 해당 80번 포트를 차지하고 있었기에 이미지 실행이 안되던 것이었다.
결국 node.js 컨테이너 중단 후 다시 명령어를 실행하니 다행히도 정상적으로 실행이 완료되었다.
늘 느끼지만 IT를 하다보면 에러 메세지는 꼼꼼히 확인해보는게 필수다.