docker

Docker 시작하기

현대의 대부분의 소프트웨어는 클라우드 환경에서 동작하게 되고, 서비스를 잘게 나누어 다양한 클라우드 환경에서 쉽게 배포하고 운영하기 위한 컨테이너 기술의 필요성이 대두되었다. 도커는 운영체제 위에서 프로세스를 독립적으로 실행가능하게 만들어 주는 리눅스 컨테이너 기술이다.

기본적으로 container 라는 환경을 구성하고 그 안에서 docker image를 실행시키는 방식이다.

여기서 docker image는 실행에 필요한 코드 및 패키지 등 모든 필요사항을 가진다.

도커는 운영체제 위에서 동작하며 같은 커널에서 어플리케이션이 동작하지만 메모리나 OS 등이 완벽하게 격리될 수 있다.

Installation

아래와 같이 brew 로 docker 를 설치하고, 권한을 할당하여 sudo 없이 docker 를 실행 할 수 있게 해준다.

1
2
brew install docker docker-compose docker-machine &&
sudo chmod 666 /var/run/docker.sock

먼저 도커를 실행하면 도커 엔진이 실행되며 도커 이미지를 도커 엔진이 실행하면 컨테이너가 생성된다.

먼저 container를 설정하기 위해서 우리는 dockerfile을 작성해야 하는데 기본적인 dockerfile의 형태는 다음과 같다.

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# set node.js environment
FROM node:8-alpine

# set working directory
WORKDIR /user/src/app

# 앱 의존성 설치
COPY package*.json ./

# docker image안에 앱의 소스코드를 넣음
COPY . .

RUN npm install

# Make port 80 available to the world outside this container
EXPOSE 8080

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["npm","start"]


# RUN chmod +x ./docker-entry.sh
# ENTRYPOINT "./docker-entry.sh"

그 뒤에 다음 명령어를 통해 docker image를 만들어 준다.

1
2
docker build -t test . // image의 별명을 입력받아 docker image를 만들어 준다.
docker image ls // 이미지의 목록을 불러온다.

앱 실행하기

다음 명령어를 통해 해당 machine의 4000번 포트를 외부 80번 포트에 연결해 준다.

1
docker run -p 4000:80 -d test # test 라는 이미지를 실행한다.

Docker container 중지하기

1
docker container stop __container_name_or_id__

docker 로그인 하기

1
docker login

Docker image 배포하기

1
2
3
4
# docker image tag 붙이기
docker tag image username/repository:tag
# docker 배포하기
docker push username/repository:tag

도커 허브의 이미지 받아서 실행하기

1
docker run -p 4000:80 username/repository:tag

지우기

1
docker container rm __image_id__

모든 도커 컨테이너 삭제

docker rm $(docker ps -a -q)

모든 도커 이미지 삭제

docker rmi $(docker images -q)

실행중인 컨테이너의 쉘에 접근

docker exec -it container_id /bin/bash

docker 실행하면서 bash 실행하기

docker run -p 80:80 -it {컨테이너 이름} /bin/bash

Docker network

아래 옵션을 주면 네트워크 포트가 매핑된다.

하지만 아래와 같은 host 네트워크는 리눅스 운영체제에서만 동작하고 mac 이나 window 환경에서는 호스트의 포트에 매핑이 되지 않으니 주의하여야 한다.

1
docker run --network host

Docker Compose

container 내에서 여러개의 image가 돌아야 하고 서비스가 복잡해 질수록 많은 이미지들을 관리해야할 필요가 생기게 된다. 여기서 docker-compose.yml을 사용한다.

즉, docker compose 는 여러개의 도커 컨테이너가 동작하기 위한 방법을 기술한 것이다.

Docker-compose.yml 파일은 docker container가 배포 환경에서 어떻게 동작해야 할지 명시한다.

docker compose의 동작 순서는 다음과 같다.

  1. dockerfile 과 함께 어플리케이션의 환경을 정의하여 어디에든 배포할 수 있도록 설정한다.
  2. docker compose 파일에 서비스들을 정의하여 독립된 환경에서 함께 실행될 수 있도록 한다.
  3. docker compose 를 실행시킨다.

docker-compose example

1
2
3
4
5
6
7
8
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
1
2
3
docker swarm init
docker stack deploy -c docker-compose.yml getstartedlab
doocker service ls

앱과 swarm을 내리기

1
2
docker stack rm getstartedlab
docker swarm leave --force

여기서 swarm 이란 여러 서버에서 동작하는 앱처럼 분산환경에서 배포하기 위한 것이다. 여러 대의 machine을 swarm 이라 불리는 dockerized cluster로 합쳐준다.

swarm을 실행하면 전체 노드들의 관리자로써 swarm을 통제할 수 있게 된다.

다음은 해당 machine을 swarm의 관리자로 임명하고 초기화하는 명령어이다.

1
docker swarm init

Docker-machine을 통해 virtual machine을 생성할 수 있는 hypervisor를 만들 수 있다.

아래 명령어를 docker-machine을 통해 vm들을 생성하는 명령어이다.

1
2
3
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
docker-machine ls

다음 명령어를 통해 특정 vm이 swarm의 manager가 되도록 한다.

1
docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"

특정 vm이 swarm에 참여하도록 하려면 다음 명령어를 수행한다.

1
2
3
docker-machine ssh myvm2 "docker swarm join \
--token <token> \
<ip>:2377"

swarm에 포함된 node 들을 보는 명령어는 다음과 같다.

1
docker-machine ssh myvm1 "docker node ls"
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×