Docker (2) :: 도커 설치와 실행

Eon Kim·2021년 10월 20일
1

Docker

목록 보기
2/5
post-thumbnail

안녕하세요, 주니어 개발자 Eon입니다.

이번 포스트는 본격적으로 Docker를 다루겠습니다.
먼저 Installation 가이드를 공유하고 설치 과정을 소개하겠습니다.
그리고 Docker Container 생성 및 사용까지 다루겠습니다.

저는 ubuntu 18.04 LTS 에서 진행했습니다.

Installation : 설치 과정

Docker install
Docker install for Ubuntu
Docker install for CentOS

위의 링크에서 Docker 설치 과정을 모두 수행해 주시면 됩니다.

설치 과정에 대해서는 공식 문서가 굉장히 설명을 잘 해두었기 때문에 추가적으로 덧붙일 것도 없어 보입니다.
아무 생각없이 커맨드를 입력하다 보면 중복으로 수행하거나, 본인의 환경에 맞지 않은 세팅까지 하게 될 수 있으니 천천히 따라하시기 바랍니다.

문서에도 소개돼 있듯, 설치가 끝나면 아래 명령어로 설치가 잘 이루어졌는지 확인해야 합니다.

docker --version

이렇게 Docker 버전을 확인할 수 있습니다.
linux 환경에서 수행할 때, sudo를 붙여 관리자 권한으로 수행해야 할 수 있습니다.
그러면 모든 Docker 명령어 앞에 sudo를 붙여야 합니다.
해당 작업이 불편하시면 아래와 같이 non-root 사용자도 Docker를 사용할 수 있게 하면 됩니다.

# Create the docker group.
$ sudo groupadd docker
 
 
# Add your user to the docker group.
$ sudo usermod -aG docker $USER
 
 
# Log out and log back in so that your group membership is re-evaluated.
# If testing on a virtual machine, it may be necessary to restart the virtual machine for changes to take effect.
# On a desktop Linux environment such as X Windows, log out of your session completely and then log back in.
# On Linux, you can also run the following command to activate the changes to groups:
$ newgrp docker
 
 
# Verify that you can run docker commands without sudo.
$ docker version
 
 
# If you initially ran Docker CLI commands using sudo before adding your user to the docker group, you may see the following error, which indicates that your ~/.docker/ directory was created with incorrect permissions due to the sudo commands.
# // WARNING: Error loading config file: /home/user/.docker/config.json -
# // stat /home/user/.docker/config.json: permission denied
 
# To fix this problem, either remove the ~/.docker/ directory (it is recreated automatically, but any custom settings are lost), or change its ownership and permissions using the following commands:
$ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
$ sudo chmod g+rwx "$HOME/.docker" -R

Manage docker as a non-root-user & Post-installation steps for linux

이렇게 Docker의 설치와 권한 설정을 해주었습니다.

What is docker image

Docker image는 Docker container를 생성하고, 실행하기 위한 재료입니다.
image는 우리가 아는 ISO image와 같다고 생각하시면 됩니다.
우리는 Windows 환경에 Ubuntu와 같은 Linux 운영체제를 사용하고 싶으면, VM을 설치합니다.
VM 앱을 먼저 설치하고, 공식 페이지에서 ISO 파일을 다운로드 받고 VM에서 실행합니다.
그러면 VM은 우리가 다운로드 받은 ISO 파일을 기반으로 운영체제를 실행합니다.

Docker image는 ISO image의 역할을 하는데, Container에서 실행될 가장 기초적인 OS가 된다고 보시면 됩니다.
Ubuntu 18.04 LTS를 설치하고 싶으면, ubuntu:18.04 또는 ubuntu:bionic 을 다운받으면 됩니다.

Docker는 이런 images를 검색하고, 본인만의 repository를 생성하고 관리할 수 있게 Github와 비슷한 페이지를 제공합니다.
Docker hub
Docker hub라는 페이지입니다. 여기서 개인의 Docker image를 버전 관리를 할 수 있고, 팀 단위로도 image 버전 관리가 가능합니다.

How to pull image

Git repo는 clone이라는 명령어로 다운로드를 합니다.
Docker image는 pull이라는 명령어로 다운로드를 합니다.

위의 Docker hub에서 원하는 Image를 찾았다면, pull하는 과정은 쉽습니다.
해당 image가 소개된 페이지를 참조하시면 pull 명령어가 함께 보이실 겁니다.

docker pull image:TAG

Docker image는 위와 같이 image의 이름과 TAG로 구성되어 있습니다.
콜론(:) 뒤에 붙는 것이 TAG이며, 버전을 관리할 때 사용됩니다.
TAG를 붙이지 않고 image까지만 pull을 하게 되면 default로 latest 태그가 붙은 버전이 pull됩니다.

How to create & run container

다운로드한 images를 사용하려면 container 상에서 구동해야 합니다.
container를 생성하는 방법은 해당 image를 사용해야만 합니다.

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

괄호 안에 있는 것들은 용도에 맞게 사용하시면 됩니다. (docs : 자세히..)
OPTIONS :

  • -i : Keep STDIN open even if not attached (container에 붙지 않은 상태에도 STDIN을 열어둡니다.)
  • -t : Allocate a pseudo-tty (가상 터미널을 할당합니다.)
  • -p : Port forwarding [host port]:[container port] (포트 포워딩입니다.)
  • -v : Volume mounting (저장소를 마운트합니다.)
  • -d : Detached (as like daemon, 비접속 상태에도 유지합니다.)
  • --name : Give name to container (container 이름을 지정합니다.)

이렇게 여섯 가지가 가장 기본적으로 많이 쓰이는 옵션입니다.
위의 옵션을 사용해서 container를 생성, 실행해보겠습니다.
위에 image 설명하며 소개한 ubuntu:bionic을 예시 image로 사용하겠습니다.

docker pull ubuntu:bionic

ubuntu:bionic image를 pull했습니다.

docker run ubuntu:bionic

이렇게 하시면 container가 바로 죽습니다.
실행은 되었으나, container를 유지할 이유가 없었던 것입니다.

실행하자마자 유지할 수 있는 방법도 있습니다.
이는 나중에 image생성을 다룰 때 같이 소개하겠습니다.

docker run -it ubuntu:bionic

이렇게 하시면 pull한 ubuntu image로 만든 container의 안에 들어온 것처럼 보이게 됩니다.
하지만 이는 컨테이너에 직접 접속한 것이 아닌, 가상 터미널과 표준 입력창을 활성화한 옵션 때문에 직접 접속한 것처럼 보이는 것입니다.

exit

위 명령어로 container 터미널에서 빠져나올 수 있습니다.

여기서 Docker process의 상태를 확인합니다.

docker ps -a

그러면 방금 만들어서 사용한 container가 목록에 나올 것이며, status는 Exited(...s)가 출력됩니다.

container 자체가 유지되지 않은 것을 볼 수 있습니다.

docker run -itd ubuntu:bionic

명령어는 실행했지만 아무 변화가 보이지 않습니다.

docker ps -a

확인을 해보니, ubuntu:bionic image로 만든 container가 실행되고 있습니다.
-itd 옵션을 넣어, detached 상태에서도 표준 입력과 터미널이 활성화되어 container가 살아 있는 것입니다.

docker run -d ubuntu:bionic
이렇게 명령어를 실행하면 실행만 detached 상태에서 할 뿐, -d 옵션을 뺀 것과 결과가 다르지 않습니다.

Attach to the container

우리가 생성한 Container에 접속하도록 하겠습니다.
Container 접속에는 exec라는 명령어를 사용합니다.
exec 명령어의 옵션에는 위에 설명한 -i, -t, -d 외에도 몇 가지 더 있습니다.
하지만 우리는 i,t만 사용하도록 합니다.

docker exec -it CONTAINER_ID|CONTAINER_NAME bash

docker exec 명령어는 현재 구동되고 있는 container에 대해서만 사용 가능합니다.

우리가 지정한 container에 접속한 것을 확인했습니다.

exit

컨테이너를 빠져나옵니다.
컨테이너는 처음에 run -itd 옵션에 의해 접속이 해제되더라도 running 상태가 유지됩니다.

Docker resource clean up

우리가 이것저것 테스트한다고 생성한 container들과 image를 제거하는 방법에 대해 알아보겠습니다.
Container는 각각 다른 환경을 구성합니다.
따라서 container 각각은 저장소를 개별적으로 차지하기 때문에 필요하지 않고 사용하지 않는 container는 꼭 지워서 관리하는 게 좋습니다.
container 명령어와 images 명령어를 사용합니다.

Container clean up

docker ps -a

먼저, 우리가 생성한 container 목록을 확인합니다.
이 중에는 현재 구동 중인 것도 있고, Exited 상태인 것도 있습니다.
Container를 제거하려면 먼저 container를 멈춰야 합니다.

docker container stop CONTAINER_ID|CONTAINER_NAME

위 container 명령어로 container를 중지할 수 있습니다.

docker ps -a

다시 한 번 container의 상태를 확인합니다.
확실히 Exited인 것을 확인했습니다.

docker container rm CONTAINER_ID|CONTAINER_NAME

위 container 명령어로 container를 제거할 수 있습니다.
제거할 container가 여러 개일 경우,

docker container rm container1 container2 container3 ...

이렇게 한 번에 제거할 수 있습니다.

Image clean up

Docker image를 확인하고 필요없는 이미지는 제거합니다.

docker images

저장된 image 리스트가 출력됩니다. (이 때, image's'인 것을 주의합니다.)

docker image rm IMAGE_ID|REPOSITORY:TAG
docker rmi IMAGE_ID|REPOSITORY:TAG

위의 두 가지 방법 중 하나로 image를 제거합니다.

docker rmi image1 image2 image3 ...

이렇게 한 번에 제거할 수 있습니다.


이번 포스트에서는 Docker container를 생성하고 실행하는 방법에 대해 다뤘습니다.
다음 포스팅은 docker-compose, httpd(apache) image를 이용한 웹페이지 제작을 다루겠습니다.
감사합니다.👍

profile
주니어 개발자

0개의 댓글