Docker docs를 보면서 이미지를 만들어보고 이것저것 따라해보려고 한다
docs.docker.com/engine/install/ubuntu/
0. Prerequistes - OS 버전 : ubuntu 18.04 (지원함!), x86_64(지원함!)
1. apt 설치 환경 설정
- docker engine을 설치하기 전 필요한 패키지 다운로드
- docker의 official GPG key를 등록하고
- docker의 stable repository를 다운로드 하기위해서 apt-repository에 등록함
$ sudo apt update
$ sudo apt install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
2. docker engine 설치
- 등록한 docker repository를 업데이트하고
- docker engine 최신 버전을 설치한다
- 설치 확인을 위해 hello-world 이미지를 실행해본다
-> hello-world 이미지가 로컬에 없으면 새로 다운로드 받아서 실행하는데,
아래처럼 간단한 메시지를 출력하고 이미지를 종료한다
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:31b9c7d48790f0d8c50ab433d9c3b7e17666d6993084c002c2ff1ca09b96391d
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
3. 튜토리얼 시작!
1) container 만들기
- docker에서 제공해주는 이미지와 앱으로 이것저것 해봄
옵션
-d : container를 detached mode로 실행함(백그라운드 실행)
-p 7000:7000 : host port 7000과 container port 7000을 연결(80포트를 이미 쓰고 있어서 바꿈)
docker/getting-started : 사용할 이미지
$ docker run -d -p 7000:7000 docker/getting-started
이 명령어를 사용하면 docker/getting-started 이미지가 없으면 다운로드하고 컨테이너 하나를 띄우게 된다
docker images로 확인해보면 repository는 2개가 있음
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker/getting-started latest 3c156928aeec 9 months ago 24.8MB
hello-world latest bf756fb1ae65 13 months ago 13.3kB
docker container ls에는 docker/getting-started에서 만든 container가 있다
$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d55b24fcfe3 docker/getting-started "nginx -g 'daemon of…" 13 minutes ago Up 12 minutes 80/tcp, 0.0.0.0:7000->7000/tcp musing_goodall
2) container에 앱 빌드하기
튜토리얼에서 제공해주는 git repo를 다운로드 한다
$ git clone https://github.com/docker/getting-started.git
위 repo 중 app만 남기고 다 지워서 아래처럼 만들어줌
.
└── getting-started
├── app
│ ├── package.json
│ ├── spec
│ ├── src
│ └── yarn.lock
Dockerfile을 사용해서 앱 빌드를 하면 image를 만들 수 있다!
app 폴더에 Dockerfile을 만들어서(package.json과 같은 위치에 있도록 함) 아래처럼 작성한다
FROM node:12-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
.
└── getting-started
├── app
│ ├── Dockerfile
│ ├── package.json
│ ├── spec
│ ├── src
│ └── yarn.lock
app 폴더에 이동해서 image를 빌드한다
app/ $ sudo docker build -t getting-started .
⬆ Dockerfile을 이용해 빌드를 하면 getting-started라는 이미지가 만들어진다는 의미
-t 옵션 : 이미지에 태그를 달아둠
Dockerfile에 적어둔 순서대로 step 1~5까지 진행된다
1에서 library/node를 다운로드 받는데, node:12-alpine의 image를 기본으로 해서 만든다고 적었기 때문
다운로드 받았으면 ./app폴더를 이미지 안으로 copy하고 yarn으로 app의 dependency 모듈을 설치함
CMD는 이 image에서 컨테이너가 실행될 때 기본적으로 실행되는 명령어를 적었음
=> 이 image의 컨테이너를 실행하면 앱이 구동된다
Sending build context to Docker daemon 4.659MB
Step 1/5 : FROM node:12-alpine
12-alpine: Pulling from library/node
0a6724ff3fcd: Pull complete
5fd2bdfdbf4b: Pull complete
80b224d472a8: Pull complete
e21405c347ae: Pull complete
Digest: sha256:41ae2b38e38e387517c59ca50498eac0537a2ff2316552c3df3b406d31414d78
Status: Downloaded newer image for node:12-alpine
---> 0206ff8a5f9e
Step 2/5 : WORKDIR /app
---> Running in 2af451a304ce
Removing intermediate container 2af451a304ce
---> 37d127849726
Step 3/5 : COPY . .
---> 024511bb3ad7
Step 4/5 : RUN yarn install --production
---> Running in 1a4e02c11244
yarn install v1.22.5
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@1.2.9: The platform "linux" is incompatible with this module.
info "fsevents@1.2.9" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
[4/4] Building fresh packages...
Done in 8.61s.
Removing intermediate container 1a4e02c11244
---> 0c71557a9c69
Step 5/5 : CMD ["node", "src/index.js"]
---> Running in 43e2186d7f04
Removing intermediate container 43e2186d7f04
---> a96cc89dc3fa
Successfully built a96cc89dc3fa
Successfully tagged getting-started:latest
3) app container 띄우기
만들어진 image를 container로 만들어 앱을 실행시킨다
$ sudo docker run -dp 3000:3000 getting-started
요렇게 되면 http://localhost:3000 으로 앱이 실행된다(??왜 안될까ㅠㅠ)
container 내부로 들어가려면 아래 명령어와 옵션을 사용하고 사용할 쉘을 지정하면 됨
$ sudo docker exec -it c456623003b1 /bin/sh
container의 포트 열린 걸 확인해보니 3000만 열려있다...
(처음에 docker run을 7000으로 했더니 안됐었다ㅠㅠ)
/app # netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 :::3000 :::* LISTEN
4) 소스코드 수정해서 container 다시 띄우기
코드를 수정한 뒤에 다시 빌드해서 image를 만든다
$ sudo docker build -t getting-started .
해당 image의 container를 실행시키면.. 안된다
이미 만들어진 container가 port를 사용하고 있기 때문에 container를 지우고 실행해야 함!
$ sudo docker ps # container ID 알아내기
$ sudo docker stop c456623003b1 # container 멈추기
$ sudo docker rm c456623003b1 # container 삭제
다시 image에서 container를 만들어 띄운다
$ sudo docker run -dp 3000:3000 getting-started
$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
49dd2e644745 getting-started "docker-entrypoint.s…" 6 seconds ago Up 4 seconds 0.0.0.0:3000->3000/tcp admiring_mclean
'개발 > DevOps' 카테고리의 다른 글
Docker 내용, 기반 기술 정리 (0) | 2021.06.21 |
---|---|
[정리] prometheus vs graphite (0) | 2021.03.03 |
Docker docs 따라하기 - 4. bind mount를 사용하기 (0) | 2021.02.09 |
Docker docs 따라하기 - 3. DB를 고정하기(named volume 사용) (0) | 2021.02.09 |
Docker docs 따라하기 - 2. online에서 docker 실행하기 (0) | 2021.02.09 |
댓글