1. 무엇을 컨테이너로 만드는것일까?
- 개발한 소프트웨어 애플리케이션을 컨테이너로 만들어 배포 및 실행 가능할 수 있다.
- 이를 통해 애플리케이션의 의존성을 관리하고, 실행 환경을 유지 한다
- MSA(Micro Service Architecture) 환경의 Polyglot 애플리케이션 운영
- MSA 환경에서는 각각의 마이크로 서비스를 컨테이너로 만들어서 관리한다
- 각 서비스는 독립적으로 배포되고 실행되고 확장할 수 있다.
- * Polyglot: 여러 언어를 구사하는 것을 말한다. 즉, 개발자에게 언어 선택의 자유를 주고 다양한 기술을 통합하는 데 도움을 준다.
2. 컨테이너를 만들때 Dockerfile을 사용한다
2.1 Dockerfile
- Docker 이미지를 빌드하기 위한 스크립트
- 쉽고, 간단, 명확한 구문을 가진 text file로 Top-Down 해석
- 대소문자를 구분하지 않지만, 대부분 대문자로 작성하여 가독성을 높인다
- 컨테이너 이미지를 생성할 수 있는 고유의 지시어를 가진다.
- Dockerfile은 'docker build' 명령을 사용하여 Docker 엔진에 의해 이미지로 빌드 된다.
2.2 Docker를 사용하여 컨테이너 이미지 생성 예시
$ mkdir build
$ cd build
$ vi hello.js
$ vi dockerfile
FROM node:12
COPY hello.js /
CMD ["node", "/hello.js"]
$ docker build -t hellojs:latest .
2.3 Dockerfile 문법
- #
- comment
- FROM
- 컨테이너 BASE IMAGE (운영환경)
- 보통 베이스 이미지를 기반으로 추가적인 소프트웨어를 설치하거나 설정한다
- 컨테이너 BASE IMAGE (운영환경)
- MAINTAINER
- 이미지를 생성한 사람의 이름 및 정보
- LABEL
- 컨테이너 이미지에 컨테이너의 정보를 저장
- 이미지 메타데이터 추가 ex) 소프트웨어 버전, 설명, 제작자 등의 정보 포함
- 컨테이너 이미지에 컨테이너의 정보를 저장
- RUN
- Docker 이미지를 빌드할 때 컨테이너 내부에서 실행할 명령을 지정
- 주로 패키지 설치, 파일 다운로드, 설정 변경에 사용됨
- Docker 이미지를 빌드할 때 컨테이너 내부에서 실행할 명령을 지정
- ADD
- 컨테이너 빌드 시 호스트의 파일(tar, url 포함)을 컨테이너로 복사
- WORKDIR
- 컨테이너 빌드 시 명령이 실행될 작업 디렉터리 설정
- ENV
- 환경변수 지정
- USER
- 명령 및 컨테이너 실행 시 적용할 유저 설정
- 일반적으로 보안상의 이유로 root 권한을 피하기 위해 사용됨
- 명령 및 컨테이너 실행 시 적용할 유저 설정
- VOLUME
- 파일 또는 디렉토리를 컨테이너의 디렉토리로 마운트
- EXPOSE
- 컨테이너 동작 시 외부에서 사용할 포트 지정
- CMD
- 컨테이너 동작 시 자동으로 실행할 서비스나 스크립트 지정
- ENTRYPOINT
- CMD와 함께 사용하면서 command 지정 시 사용
3. 생성한 컨테이너 배포 예시
- 아래의 예시처럼 Docker HOST 에서 Docker Hub 로 배포한다
//1. 이미지 빌드: Dockerfile을 사용하여 컨테이너 이미지 빌드
$ docker build - t hello.js:latest .
//2. Docker Hub 로그인
$ docker login
//3. 이미지 푸시: 빌드한 이미지를 Docker Hub로 푸시
$ docker push hello.js:latest
도커 컨테이너 실습 예제
1. nodejs 애플리케이션 컨테이너 생성
- 환경: VirtualBox, Ubuntu
1.1 폴더 생성
$ mkdir hellojs
1.2 파일 생성
- hello.js 파일을 생성해서 node 소스코드 생성
$ cd hellojs
$ cat > hello.js
### hello.js 아래 내용 입력
const http = require('http');
const os = require('os');
console.log("Test server starting...");
var handler = function(request, response) {
console.log("Received request from " + request.connection.remoteAddress);
response.writeHead(200);
response.end("Container Hostname: " + os.hostname() + "\n");
};
var www = http.createServer(handler);
www.listen(8080);
1.3 dockerfile 생성
$ vi dockerfile
### dockerfile 아래 내용 입력
FROM node:12
COPY hello.js /
CMD ["node", "/hello.js"]
### dockerfile 확인
$ cat dockerfile
FROM node:12
COPY hello.js /
CMD ["node", "/hello.js"]
1.4 이미지 빌드
$ docker build -t hellojs:latest .
### "hellojs" 라는 도커 이미지로 빌드
### ":latest" 생략 시 자동으로 붙어서 생성됨
1.5 이미지 빌드 결과 확인
$ docker iamges
### 출력
REPOSITORY TAG IMAGE ID CREATED SIZE
hellojs latest 0ac27bfc0ecf 6 seconds ago 918MB
1.6 "FROM node:12"
링크
https://hub.docker.com/search?q=node
Docker Hub 사이트에 접속해서 BASE IMAGE를 찾을 수 있음
Supported tags and respective Dockerfile links
2. 우분투 기반의 웹 서버 컨테이너 생성
2.1 웹 서버 컨테이너 생성
### 1. 폴더생성
$ mkdir webserver
### 2. 폴더 진입
$ cd webserver
### 3. Dockerfile 생성
$ vim Dockerfile
FROM ubuntu:18.04
LABEL maintainer="NJ K <tester@gmail.com>"
# install apache
RUN apt-get update \
&& apt-get install -y apache2
RUN echo "TEST WEB" > /var/www/html/index.html
EXPOSE 80
CMD ["/usr/sbin/apache2ctl", "-DFOREGROUND"]
### 4. 이미지 생성
$ docker build -t webserver:v1 .
### 5. 이미지 확인
$ docker ps
REPOSITORY TAG IMAGE ID CREATED SIZE
webserver v1 42a07139654d 12 seconds ago 205MB
hellojs latest 0ac27bfc0ecf 2 hours ago 918MB
2.1 웹 서버 컨테이너 실행
- webserver 실행
### webserver 실행
$ docker run -d -p 80:80 --name web webserver
e3f9030358f2f077406bd31dcaa7aa4a0acbeeb3617ee3ae9ae6e236a145e07f
### docker 실행 여부 확인
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e3f9030358f2 webserver:v1 "/usr/sbin/apache2ct…" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp web
### webserver 실행
$ curl localhost:80
TEST WEB
### webserver container 삭제
$ docker rm -f web
2.2 웹 서버 컨테이너 실행
- hellojs
### hellojs 실행
$ docker run -d -p 8080:8080 --name web hellojs
3eb884b5012effd33a53b625fc37b6c870a5d3052457c8796c38f08629cbec9e
### docker 실행 여부 확인
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3eb884b5012e hellojs "docker-entrypoint.s…" 2 seconds ago Up Less than a second 0.0.0.0:8080->8080/tcp, :::8080->8080
### hellojs 실행
$ curl localhost:8080
Container Hostname: 3eb884b5012e
### hellojs container 삭제
$ docker rm -f web
3. Docker Hub 배포
3.1 Docker 로그인
$ docker login
3.2 이미지 이름 변경
- 도커허브에 배포하기 위해서는 아래와 같이 이름이 변경되야됨
- webserver:v1 -> knj94/webserver:v1
- hellojs:latest -> knj94/hellojs:latest
- 도커 허브에 배포하기위해서는 자신의 아이디가 포함되어 있어야함
$ docker tag webserver:v1 knj94/webserver:v1
$ docker tag webserver:v1 knj94/webserver:v1
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
knj94/webserver v1 42a07139654d 12 minutes ago 205MB
webserver v1 42a07139654d 12 minutes ago 205MB
knj94/hellojs latest 0ac27bfc0ecf 2 hours ago 918MB
hellojs latest 0ac27bfc0ecf 2 hours ago 918MB
3.3 배포
$ docker push knj94/webserver:v1
$ docker push knj94/hellojs
3.4 확인
4. 문제풀이
Q. 주어진 script를 실행하는 컨테이너를 빌드하시오
- 컨테이너 이름: fortune:20.02
- dockerfile의 내용
- base image: debian
- 컨테이너에 아래의 webpage.sh 파일을 복사
-
#!/bin/bash mkdir /htdocs while : do /usr/games/fortune > /htdocs/index.html sleep 10 done
- 컨테이너에 fortune 애플리케이션 설치: apt-get install fortune
- 컨테이너 실행 시 저장한 webpage.sh가 실행되도록 구성
참고
[따배도] 4-1. 도커 컨테이너 만들어보기: 이론편
https://www.youtube.com/watch?v=9qnD8aODu-4&list=PLApuRlvrZKogb78kKq1wRvrjg1VMwYrvi&index=11
[따배도] 4-2. 도커 컨테이너 만들어보기: 실습
https://www.youtube.com/watch?v=WLjfzwdASbw&list=PLApuRlvrZKogb78kKq1wRvrjg1VMwYrvi&index=12
'Docker' 카테고리의 다른 글
[Docker] Docker 컨테이너 생성 - 예제 정답 (0) | 2024.02.15 |
---|---|
[Docker] Docker 컨테이너 간단한 실습 예제 (1) | 2024.02.06 |
[Docker] 도커 컨테이너란? (0) | 2024.02.06 |
[Docker] Docker 관리자 권한 부여 (0) | 2024.02.05 |
[Docker] 로컬 환경 구성 6 - CentOS Docker 설치 (0) | 2024.02.05 |