Sua Blog
Docker 컨테이너 띄우기
- Docker 설치 및 build
-
설치 파일 다운로드 https://www.docker.com/products/docker-desktop 에서 도커 설치 파일을 다운받아 설치한다.
-
설치가 되면 도커를 실행한다.


터미널을 열고 아래 명령어를 입력한다.
docker run -d -p 80:80 docker/getting-started
run: 이미지로 컨테이너를 생성
-d: 컨테이너를 분리하여 실행
-p 80:80: 호스트 80 포트를 컨테이너 80 포트에 맵핑
docker/getting-started: 도커에서 제공하는 이미지

- 브라우저를 열고 http://localhost에 접속한다.

- 도커에서 제공하는 소스를 빌드한다.
우선 소스를 다운 받은 뒤
package.json이 위치한 같은 경로에Dockerfile(컨테이너 이미지를 만드는데 사용되는 텍스트 기반 스크립트)을 생성하고 아래 소스를 입력한다.
FROM node:12-alpine // 새로운 이미지를 생성할 때 기반으로 사용할 이미지를 지정
WORKDIR /app // 이동할 디렉토리
COPY . . // 소스를 container로 복사
RUN yarn install --production // 실행 될 명령어
CMD ["node", "src/index.js"] // 도커가 실행 될 때 실행할 명령어
- Dockerfile을 작성했으면 docker build 명령어로 이미지를 생성할 수 있다.

docker build -t getting-started .
-t: 생성될 이미지 이름 설정
.: Dockfile의 경로(현재 폴더)
- 포트는 3000번으로 맵핑하고 생성해준 이미지 파일으로 도커를 실행한다.
docker run -dp 3000:3000 getting-started
- 브라우저를 열어 localhost:3000에 접속한다.

애플리케이션이 실행된 것을 확인한다.
Docker Hub
-
Docker Hub 가입 후 로그인 한다.

Create Repository를 클릭하여 새로운 저장소를 만든다.
저장소이름을 getting-started로 설정하고 만들어진 저장소를 확인한다.
- 터미널에서
docker login을 입력하고 아이디와 비밀번호를 입력한다.

docker tag를 사용하여 getting-started 이미지에 tag이름을 만든다.
docker tag getting-started(태그명) [계정 이름]/[이미지 파일명]
- 저장소로 push 한다.
docker push [계정이름]/[저장소]

Docker Hub에 들어가서 확인하면 커밋을 확인 할 수 있다.

- 현재 3000번에 매핑되어있는 컨테이너를 중지(docker stop 컨테이너 id)하고 저장소에 있는 이미지 파일을 실행한다.
docker stop [컨테이너]
docker run -dp 3000:3000 [계정명]/[저장소]

localhost:3000번에 접속하면 해당 컨테이너가 작동되는 것을 확인 할 수 있다.
- 파일 시스템
도커 컨테이너는 유니언 파일 시스템
Unoion File System으로 복수의 레이어로 구현된다. 도커 컨테이너는 이미지로부터 생성되는 인스턴스이고 하나의 이미지로부터 여러개의 컨테이너를 생성할 수 있다. 하위 레이어는 읽기 전용 이며, 쓰기 작업은 상위 레이어로 복사해서 이루어지기 때문에 하나의 이미지로부터 복수의 컨테이너가 실행되어도 문제가 생기지 않는다.


Volume
현재 컨테이너에 투두리스트는 컨테이너가 중지되었다가 다시 작동하면 저장하고 있던 데이터를 잃게 된다. 컨테이너에 데이터를 보관할 수 있도록 작업을 해야한다. 데이터를 저장하려면 볼륨(데이터를 컨테이너가 아닌 호스트에 저장하는 방식)을 생성하고 데이터가 저장된 디렉토리에 연결(마운팅)함으로써 데이터를 유지할 수 있다.

docker volume create를 사용하여 불륨을 만든다.
docker volume create todo-db
- 현재 도커가 볼륨을 사용하지 않고 실행중이므로 중단하고 볼륨을 마운트하는 명령어를 추가해서 컨테이너를 실행한다.

-v: 볼륨 지정
브라우저를 열고 투두리스트에 항목을 추가한다.

해당 컨테이너를 제거하고 다시 컨테이너를 시작한다.

다시 브라우저를 열고 확인하면 추가했던 항목들이 그대로 유지되어있다.
- 볼륨이 어디 저장되어있는지 확인하려면
docker volume inspect명령어를 사용해서 확인 할 수 있다.

inspect: 데이터 저장위치 확인
- 바인드 마운트
컨테이너의 생명 주기와 관계없이 데이터를 저장할 수 있는 방법은 volume, bind mount다. 바인드 마운트는 볼륨에 비해 기능이 제한되어있다. 바인드 마운트를 사용하면 호스트 시스템의 파일 또는 디렉토리가 호스트 시스템의 전체 또는 상대경로로 참조된다.

-
볼륨
- 볼륨하나는 여러 컨테이너에 동시에 마운트 될 수 있다. (여러 컨테이너 간에 데이터를 공유 할 때 좋다.)
- 볼륨을 사용하는 실행 중인 컨테이너가 없더라도 자동으로 삭제되지 않다.
- 바인드 마운트에 비해 백업이 쉽다.
- 원격 호스트나 클라우드에 저장할 수 있게 해주고, 암호화를 할 수 있고, 다른 기능을 추가 할 수 있다.
-
바인드 마운트
- 호스트 시스템 어디에나 데이터를 저장할 수 있고, 도커가 아닌 프로세스도 이 파일을 수정 할 수 있다.
- 호스트 머신의 설정 파일을 컨테이너에 공유 할 때 사용하면 좋다.
- 컨테이너에 추가 데이터를 제공 할 때 자주 쓰입니다.
Docker에서는 Bind mounts보다는 Volume을 사용하기를 추천한다.
- 3000번 포트에 맵핑되어있던 컨테이너를 중지시키고 아래의 명령어로 새로운 컨테이너를 실행한다.

docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
node:12-alpine \
sh -c "yarn install && yarn run dev"
-w: 명령이 실행 될 현재 디렉토리를 설정
-v "$(pwd):/app: 바인드 마운트를 /app 디렉토리에 마운트
node:12-alpine: 사용할 이미지(Dockerfile)에서 가져온 기본 이미지
sh -c "yarn install && yarn run dev": 이미지가 시작되고 실행되는 명령어
docker logs명령어를 사용해서 실행 로그를 확인한다.

yarn install, yarn run dev가 실행된 것을 확인 할 수 있다.
- 소스를 조금 수정하고 저장해본다. 그리고 새로 고침해서 변경사항을 확인한다.
적용 전

적용 후

버튼이 add item > add로 바로 변경된 것을 확인 할 수 있다.
- 실행중인 컨테이너를 중지하고 빌드한다.

Network
- 컨테이너 네트워킹, My SQL 추가
기본적으로 컨테이너는 각각 실행되며 다른 프로세스나 컨테이너에 영향을 받지 않는다. 하지만 두 컨테이너가 동일한 네트워크에 있으면 서로 통신 할 수 있다.
네트워크에 컨테이너를 배치하는 방법에는 두가지가 있다. 첫째, 컨테이너를 생성할 떄 네트워크를 함께 생성한다. 두번쨰, 기존 컨테이너를 네트워크에 연결한다.
먼저 첫번째 방법으로 네트워크를 만들어서 My SQL 컨테이너를 연결하는 방법이 있다.
docker network create를 사용해서 네트워크를 만든다.
docker network create todo-app
-
MySQL 컨테이너를 생성하고 네트워크에 연결한다. 또한 데이터 베이스를 초기화하는 몇가지 환경 변수를 정의해준다.

docker run -d \
--network todo-app --network-alias mysql
-v todo-mysql-data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=secret
-e MYSQL_DATABASE=todos
mysql:5.7
-v todo-mysql-data:/var/lib/mysql: volume을 따로 만들어주지 않아도, 해당 volume이 없으면 docker에서 자동 생성해서 mount시켜줌
--network : 네트워크 연결
-e: 환경변수를 포함해서 컨테이너 생성
- 현재 실행 중인 컨테이너를 확인하고 MySQL컨테이너에 접속한다.

docker exec -it <mysql-container-id> mysql -p
mysql -p: MySQL 접속해서 작동하고 있음 확인
환경 변수에 설정했던 비밃번호를 입력하면 MySQL에 접속된다.
SHOW DATABASES;를 사용하여 만들어진 데이터 베이스를 확인할 수 있다.

- 같은 네트워크에 있다면 MySQL컨테이너를 다른 컨테이너에서 연결 할 수 있다. (각 컨테이너는 고유한 IP를 갖고있다.)
우선 새로운 컨테이너를 만들고 동시에 네트워크를 연결한다.
도커에서 제공하는 이미지인
nicolaka/netshoot를 사용한다. 이 이미지는 네트워킹 문제해결이나 디버그에 유용한 도구가 포함되어있다.

docker run -it --network todo-app nicolaka/netshoot
-i: 실행
-t: 들어가기
- -it 로 컨테이너 내부로 들어와있다.
dig명령어로 mysql의 IP주소를 알 수 있다.

dig: dns 도구
ANSWER SECTION을 보면 IP주소가 172.18.0.2인 것을 확인 할 수 있다.
- todo app은 MySQL 설정을 위한 환경변수를 지원한다.
MYSQL_HOST: the hostname for the running MySQL server
MYSQL_USER: the username to use for the connection
MYSQL_PASSWORD: the password to use for the connection
MYSQL_DB: the database to use once connected
위의 환경변수를 이용해서 컨테이너를 만들어 준다.