프로그램을 다운 받는 과정을 간단하게 하고 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장 하기 위해서 필요하다. 도커를 사용하면 코드를 더 빨리 전달하고 애플리케이션 운영을 표준화하고, 코드를 원활하게 이동하고, 리소스 사용률을 높일 수 있다.
도커 컨테이너와 가상머신은 격리된 환경 내에 애플리케이션을 배치한다는 공통점이 있지만, 도커 컨테이너는 게스트 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"]
도커에서의 이미지란?
도커에서의 컨테이너란?
이미지와 컨테이너의 관계
도커 이미지 레이어