도커의 개념과 기초

dong5854·2022년 2월 10일
1

docker

목록 보기
1/8
post-thumbnail
도커의 개념
도커를 사용하는 이유

프로그램을 다운 받는 과정을 간단하게 하고 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장 하기 위해서 필요하다. 도커를 사용하면 코드를 더 빨리 전달하고 애플리케이션 운영을 표준화하고, 코드를 원활하게 이동하고, 리소스 사용률을 높일 수 있다.

도커와 가상머신의 차이

도커 컨테이너와 가상머신은 격리된 환경 내에 애플리케이션을 배치한다는 공통점이 있지만, 도커 컨테이너는 게스트 OS를 설치할 팔요가 없어 이미지의 용량이 크게 줄어들고, 가상머신들에 비에 이미지를 관리, 공유 및 배포하는 기능이 뛰어나다.

컨테이너와 이미지

컨테이너는 애플리케이션과 애플리케이션의 구동을 위한 환경을 담고 있는 실행 가능한 소프트웨어의 단위로 볼 수 있다. 그리고 이미지는 컨테이너를 위한 템플릿 내지는 청사진이라고 할 수 있다. 정확히는 이미지가 애플리케이션을 위한 코드와 필요한 툴 및 런타임들이 있고 이를 컨테이너가 실행하는 것이다.

따라서 이미지를 하나 생성해 둔다면 그 이미지를 사용하여 복수의 컨테이너를 실행할 수 있다.

도커 허브

도커 허브에서는 생성된 이미지를 웹에 업로드하거거나 다운로드 할 수 있는 서비스이다. 우리가 자주 사용하는 redis, mongoDB, node 혹은 NGINX와 프로그램들은 도커 허브에서 공식 이미지로 제공하기 때문에 쉽게 이미지를 다운받아 사용할 수 있다.

docker search: 도커 허브에 있는 이미지를 검색 할 수 있는 명령어이다. 아래는 mysql를 검색한 결과이다.

dong@ubuntu:~$ sudo docker search mysql
[sudo] password for dong: 
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   12090     [OK]       
mariadb                           MariaDB Server is a high performing open sou…   4633      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   905                  [OK]
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   92                   
mysql/mysql-cluster               Experimental MySQL Cluster Docker images. Cr…   92                   
centurylink/mysql                 Image containing mysql. Optimized to be link…   59                   [OK]
databack/mysql-backup             Back up mysql databases to... anywhere!         54                   
prom/mysqld-exporter                                                              46                   [OK]
deitch/mysql-backup               REPLACED! Please use http://hub.docker.com/r…   40                   [OK]
tutum/mysql                       Base docker image to run a MySQL database se…   35                   
linuxserver/mysql                 A Mysql container, brought to you by LinuxSe…   35                   
schickling/mysql-backup-s3        Backup MySQL to S3 (supports periodic backup…   31                   [OK]
mysql/mysql-router                MySQL Router provides transparent routing be…   23                   
centos/mysql-56-centos7           MySQL 5.6 SQL database server                   21                   
arey/mysql-client                 Run a MySQL client from a docker container      20                   [OK]
fradelg/mysql-cron-backup         MySQL/MariaDB database backup using cron tas…   18                   [OK]
genschsa/mysql-employees          MySQL Employee Sample Database                  9                    [OK]
yloeffler/mysql-backup            This image runs mysqldump to backup data usi…   7                    [OK]
openshift/mysql-55-centos7        DEPRECATED: A Centos7 based MySQL v5.5 image…   6                    
ansibleplaybookbundle/mysql-apb   An APB which deploys RHSCL MySQL                3                    [OK]
devilbox/mysql                    Retagged MySQL, MariaDB and PerconaDB offici…   3                    
idoall/mysql                      MySQL is a widely used, open-source relation…   3                    [OK]
jelastic/mysql                    An image of the MySQL database server mainta…   2                    
centos/mysql-80-centos7           MySQL 8.0 SQL database server                   2                    
widdpim/mysql-client              Dockerized MySQL Client (5.7) including Curl…   1                    [OK]

docker pull: 도커 허브에서 이미지를 받을 수 있다. docker pull <이미지 이름>:<태그>형식으로 구성되어 있어 태그를 지정해 줄 수 있다. 디폴트는 latest기 때문에 최신 버전을 받고 싶다면 굳이 넣어 줄 필요는 없지만 아래처럼 지정해주어도 문제는 없다.

dong@ubuntu:~$ sudo docker pull mysql:latest
[sudo] password for dong: 
latest: Pulling from library/mysql
6552179c3509: Pull complete 
d69aa66e4482: Pull complete 
3b19465b002b: Pull complete 
7b0d0cfe99a1: Pull complete 
9ccd5a5c8987: Pull complete 
2dab00d7d232: Pull complete 
64d3afdccd4a: Pull complete 
82148d50b16c: Pull complete 
8bb7d73a7d0c: Pull complete 
74778cd68a75: Pull complete 
d7e5f9309140: Pull complete 
f2e376ecd59f: Pull complete 
Digest: sha256:92d27b8222bbcf53bc42c70ca7cd1010d6c0527efc61f14980ce77c50932bef4
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
도커 설치

도커는 아래 공식 도큐먼트를 참고하면 쉽게 설치할 수 있다.

https://docs.docker.com/engine/install/ubuntu/

docker ps -a : docker ps를 통해 현재 실행중인 컨테이너를 확인 할 수 있고, -a 옵션을 통해 실행중이 아닌 컨테이너도 전부 확인 가능하다.

dong@ubuntu:~/docker-complete$ sudo docker ps
[sudo] password for dong: 
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
0e74f3d74044   31bc868478b8   "docker-entrypoint.s…"   53 seconds ago   Up 52 seconds   80/tcp    jovial_kapitsa

docker images : 이미지의 목록을 확인할 수 있는 명령어

docker run: 이미지를 컨테이너로 생성한 뒤 실행시키는 명령어로 -i(interactive), -t(Pseduo-tty)옵션을 사용하면 실행된 쉘에서 입력 및 출력이 가능하고, --name옵션으로 컨테이너의 이름을 지정할 수 있다. 이름을 지정하지 않으면 docker가 자동으로 무작위 이름을 지정한다. 또한 -p 옵션을 통해 호스트 운영체제와 컨테이너의 포트를 매핑 시킬 수 있다. 아래의 예시에서는 호스트의 3000번 포트를 컨테이너의 80번 포트와 매핑시킨다.

#-p 플래그는 publish를 의미
dong@ubuntu:~/docker-complete$ sudo docker run -p 3000:80 31bc868478b8

docker build: docker build <옵션> <dockerfile 경로> 를 통해 dockerfile을 이용해 이미지를 생성할 수 있다. --tag 옵션으로 이미지 이름과 태그를 설정할 수 있다.

dong@ubuntu:~/docker-complete$ sudo docker build .
[sudo] password for dong: 
Sending build context to Docker daemon  6.656kB
Step 1/6 : FROM node
 ---> 1dbd1eb1b352
Step 2/6 : WORKDIR /app
 ---> Running in 8e08775d0a32
Removing intermediate container 8e08775d0a32
 ---> 5d18675947f8
Step 3/6 : COPY . /app
 ---> 4569a753147f
Step 4/6 : RUN npm install
 ---> Running in e58fce12e557

added 61 packages, and audited 62 packages in 3s

2 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
npm notice 
npm notice New patch version of npm available! 8.3.1 -> 8.3.2
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v8.3.2>
npm notice Run `npm install -g npm@8.3.2` to update!
npm notice 
Removing intermediate container e58fce12e557
 ---> 6231ce5fa61b
Step 5/6 : EXPOSE 80
 ---> Running in 25aa6451ac44
Removing intermediate container 25aa6451ac44
 ---> fac82edda399
Step 6/6 : CMD ["node", "server.js"]
 ---> Running in 82404e9aca60
Removing intermediate container 82404e9aca60
 ---> 31bc868478b8
Successfully built 31bc868478b8

docker stop: docker stop <컨테이너명> 을 통해 컨테이너를 멈출 수 있다.

dong@ubuntu:~/docker-complete$ sudo docker stop jovial_kapitsa
jovial_kapitsa
dong@ubuntu:~/docker-complete$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
dong@ubuntu:~/docker-complete$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                        PORTS     NAMES
0e74f3d74044   31bc868478b8   "docker-entrypoint.s…"   3 minutes ago    Exited (137) 48 seconds ago             jovial_kapitsa
f636acf4aea9   node           "docker-entrypoint.s…"   28 minutes ago   Exited (0) 27 minutes ago               focused_williamson
5c7cea748b17   node           "docker-entrypoint.s…"   30 minutes ago   Exited (0) 30 minutes ago               vigilant_bartik
09f67efccfea   989df459e007   "docker-entrypoint.s…"   26 hours ago     Exited (137) 26 hours ago               interesting_snyder
도커 이미지의 최적화

만약 소스 코드를 수정하면 이미지를 다시 빌드해 주어야 소스코드가 변경된 이미지가 생성된다.

도커의 이미지는 레이어 단위로 생성되며 변경이 없는 한 캐시로 처리가 된다. 하지만 변화가 감지되면 그 아래 레이어들을 모두 다시 동작시키기 때문에 아래외 같이 도커파일을 작성하여 설치한 패키지에 변화가 없을 경우 캐시된 내용을 그대로 사용할 수 있도록 조금 더 최적화 시킬 수 있다.

FROM node

WORKDIR /app

COPY package.json /app

RUN npm install

COPY . /app

EXPOSE 80

CMD ["node", "server.js"]
총정리
  1. 도커에서의 이미지란?

    • 애플리케이션에 필요한 서버 프로그램, 소스코드 및 라이브러리 컴파일된 실행 파일이 묶여있는 컨테이너의 생성을 위한 템플릿
  2. 도커에서의 컨테이너란?

    • 이미지를 기반으로 생성된 독립된 소프트웨어의 단위
  3. 이미지와 컨테이너의 관계

    • 같은 이미지를 이용하여 서로 독립된 환경의 컨테이너를 생성 할 수 있다.
  4. 도커 이미지 레이어

    • 도커의 이미지는 여러 개의 읽기 전용 레이어로 구성되고 파일이 추가되면 새로운 레이어가 생성된다. 도커는 여러 개의 레이어를 묶어서 하나의 파일 시스템으로 사용할 수 있게 해준다. 이 레이어는 캐시가 가능하고 레이어를 통해 이미지의 재구축과 버전관리를 통한 공유가 가능하다.
profile
https://github.com/dong5854?tab=repositories

0개의 댓글