코드코코

[Docker] [도커 기본 개념] [실습] 도커 컨테이너 본문

기록/Docker

[Docker] [도커 기본 개념] [실습] 도커 컨테이너

코드코코 2022. 6. 4. 00:24

도커 컨테이너

  1. 무엇을 컨테이너로 만드는 건가요?
  2. 컨테이너 어떻게 만들어요? Dockerfile이 뭐죠?
  3. 내가 만든 컨테이너를 배포하려면?

 

1. 무엇을 컨테이너로 만드는 건가요?

- 컨테이너 : 개발한 어플리케이션(실행파일)과 운영환경이 모두 들어 있는 독립된 공간

- 개발한 프로그램과 실행환경을 모두 컨테이너로 만듦.

- MSA(Micro Service Architecture) 환경의 Polyglot 애플리케이션 운영

 

*Polyglot Programming : 다양한 언어를 사용하여 프로그래밍 하는 것.

 

 

2. 컨테이너 어떻게 만들어요? Dockerfile이 뭐죠?

- Dockerfile을 이용해 컨테이너를 빌드

- Dockerfile은

  • 쉽고, 간단, 명확란 구문을 가진 text file 로 Top-down 해석
  • 컨테이너 이미지를 생성할 수 있는 고유의 지시어(instruction)를 가짐
  • 대소문자 구분하지 않으나 가독성을 위해 사용함.

ex)

$ mkdir build

$ cd build

$ vi dockerfile

FROM node:12

COPY hello.js

CMD ["node", "/hello.js"]

$ docker build -t imagename:tag .

 

cmd - 명령어 치환 가능(binary)

entrypoint - 명령어 치환 불가능(arument, option)

 

3. 내가 만든 컨테이너를 배포하려면?

ex)

$ docker build -t imagename:tag .

$ docker login

$ docker push hellojs:latest

 


[실습1] nodejs 애플리케이션 컨테이너 만들기 : hellojs

 

$ vim hello.js

- vim 에디터를 사용하여 파일 작성

- hello.js

cosnt http = require('http');
const os = require('os');
console.log("Test server starting...");

var handler = function(req,res){
	console.log("Recieved request from " + req.connection.remoteAddress);
	res.writeHead(200);
	res.end("Container Hostname:" + os.hostname() + "\n");
};

var www = http.createServer(handler);
www.listen(8080);

$ vim dockerfile

- dockerfile

# 베이스 이미지
FROM node:18
# 해당 파일을 컨테이너의 최상위 디렉토리로 이동
COPY hello.js /
# 컨테이너 러닝시 command 실행
CMD ["node","/hello.js"]

 

$ docker build -t hellojs:latest .

- docker 빌드

guru@docker-ubuntu:~/hellojs$ docker build -t hellojs:latest .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM node:18
18: Pulling from library/node
e756f3fdd6a3: Pull complete 
bf168a674899: Pull complete 
e604223835cc: Pull complete 
6d5c91c4cd86: Pull complete 
2cc8d8854262: Pull complete 
b8798d556362: Pull complete 
34a8686a1a70: Pull complete 
cff44b507872: Pull complete 
92ed088b5633: Pull complete 
Digest: sha256:52bda4c171f379c1dcba5411d18ed83ae6e99c3751cad67a450684efb9491f6b
Status: Downloaded newer image for node:18
 ---> 4c60c47ec5e4
Step 2/3 : COPY hello.js /
 ---> d9d798fb7f0f
Step 3/3 : CMD ["node","/hello.js"]
 ---> Running in 2fe1bd3f93bb
Removing intermediate container 2fe1bd3f93bb
 ---> c6b4c24b2bb8
Successfully built c6b4c24b2bb8
Successfully tagged hellojs:latest

$ docker images

- 빌드된 이미지 확인

guru@docker-ubuntu:~/hellojs$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
hellojs      latest    c6b4c24b2bb8   12 seconds ago   996MB
node         18        4c60c47ec5e4   6 days ago       996MB

 

$ docker run -d -p 8080:8080 --name web hello.js

- 컨테이너 실행

 

$ docker ps

- 실행중인 컨테이너 확인

 

$ curl localhost:8080

- 실행중인 컨테이너 접속

guru@docker-ubuntu:~/hellojs$ docker run -d -p 8080:8080 --name web hellojs
1853460df6ee58ba91da790081cb748bdc36414a91d1a4775734afa20167d1bb


guru@docker-ubuntu:~/hellojs$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                       NAMES
1853460df6ee   hellojs   "docker-entrypoint.s…"   4 seconds ago   Up 3 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   web


guru@docker-ubuntu:~/hellojs$ curl localhost:8080
Container Hostname:1853460df6ee

 


 

[실습2] 우분투 기반의 웹서버 컨테이너 만들기

 

Dockerfile 작성

FROM ubuntu:18.04
LABEL maintainer="codecoco <isawmy@nate.com>"
# install apache 
RUN apt-get update \
    && apt-get install -y apache2
# apache2가 서비스 해주는 위치
RUN echo "TEST WEB" > /var/www/html/index.html
# 이 컨테이너가 서비스 해주는 포트
EXPOSE 80
# application demon의 위치, argument
CMD ["/usr/sbin/apache2ctl", "-DFOREGROUND"]

 

빌드

guru@docker-ubuntu:~/webserver$ docker build -t webserver:v1 .

 

실행

guru@docker-ubuntu:~/webserver$ docker run -d -p 80:80 --name web webserver:v1
9db1f1b24b6b59131ac9780db370baec6540727885b10669e62f9beb19249a02

 

 

curl 를 통해 접속확인

 

 

 

$ docker rm -f web.v3

- 실행 중 컨테이너 삭제

 

 


 

[실습3] 만들어 놓은 컨테이너 배포하기

 

$ docker login

-도커 로그인

guru@docker-ubuntu:~$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: isawmy
Password: 
WARNING! Your password will be stored unencrypted in /home/guru/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

 

$ docker tag webserver:v1 isawmy/webserver:v1

- 이름 변경하기

- 계정을 앞에 붙여야 함

guru@docker-ubuntu:~/webserver$ docker tag webserver:v1 isawmy/webserver:v1

- 이미지 아이디는 동일 이름만 각각 두개씩 있는 것.

 

$ docker push isawmy/webserver

- 계정에 푸시 하고 배포

guru@docker-ubuntu:~/webserver$ docker push isawmy/webserver
Using default tag: latest
The push refers to repository [docker.io/isawmy/webserver]
tag does not exist: isawmy/webserver:latest
guru@docker-ubuntu:~/webserver$ docker push isawmy/webserver:v1
The push refers to repository [docker.io/isawmy/webserver]
7b315dec771a: Pushed 
cfab7b63ccac: Pushing [===================>                               ]  53.49MB/137.3MB
cfab7b63ccac: Pushed 

v1: digest: sha256:dccc89e5394b27b5680de72113ad5c2efd1e6833d130a6503638ca426fe8e066 size: 948

- hub.docker.com에서 확인됨.

- 레퍼지토리에서 풀 받아서 사용가능

 

학습영상 : https://www.youtube.com/watch?v=WLjfzwdASbw&list=PLApuRlvrZKogb78kKq1wRvrjg1VMwYrvi&index=12