윤제로의 제로베이스

Docker 찍먹 실습 (2) 본문

Background/Docker

Docker 찍먹 실습 (2)

윤_제로 2023. 8. 11. 15:31

도커 실습 시작!

도커 설치하기

curl -fsSL https://get.docker.com/ | sudo sh

sudo 없이 docker 사용하기

docker는 기본적으로 root권한을 필요로 하기 때문에 root가 아닌 사용자가 sudo 없이 사용하려면 사용자를 docker 그룹에 추가해야 한다.

sudo usermod -aG docker $USER # 현재 접속중인 사용자에게 권한주기
sudo usermod -aG docker your-user # your-user 사용자에게 권한주기

컨테이너 실행하기

도커 실행 명령어

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

주로 사용하는 옵션들

  • -d : detached mode. 백그라운드 모드
  • -p : 호스트와 컨테이너의 포트 연결 (포워딩)
  • -v : 호스트와 컨테이너의 디렉토리 연결 (마운트)
  • -e : 컨테이너 내부에서 사용할 환경변수 설정
  • --name : 컨테이너 이름 설정
  • --rm : 프로세스 종료시 컨테이너 자동 제거
  • --it : -i 와 -t를 동시에 사용. 터미널 입력을 위한 옵션
  • --link : 컨테이너 연결 [컨테이너명:별칭]

Ubuntu container

docker run ubuntu:18.04

run 명령어를 사용하면 사용할 이미지가 저장되어있는지 확인하고 이미지가 없으면 다운로드(pull) 한 후 컨테이너를 생성(create)하고 시작(start)한다.

위의 예제는 ubuntu:18.04 이미지를 다운받은 후 실행된다. 실행한 후 무엇을 해야하는지 명령어를 전달하지 않았기 때문에 컨테이너 생성되자마자 종료된다. 컨테이너는 프로세스이기 때문에 실행중인 프로세스가 없으면 컨테이너는 종료된다.

이번엔 /bin/bash 명령어를 입력해서 실행

docker run --rm -it ubuntu:18.04 /bin/bash

# in container
$ cat /etc/issue

컨테이너 내부로 들어가기 위해 bash 실행. 키보드 입력을 위한 -it 옵션 + 프로세스가 종료되면 컨테이너가 자동으로 삭제되도록 --rm

cat /etc/issue 명령어를 통해 ubuntu 리눅스 인 걸 확인 가능.

exit로 bash 쉘을 종료하면 컨테이너도 같이 종료된다.

redis container

docker run -d -p 1234:6379 redis

$ telent local 1234 
set mykey hello
# +OK
get mykey
# hello

-d 옵션을 주었기 때문에 컨테이너를 실행하자마자 컨테이너의 ID를 보여주고 바로 쉘에 들어가게 된다. 컨테이너는 종료된게 아니고 백그라운드로 돌아가고 있고 컨테이너 ID를 이용하여 컨테이너를 제어할 수 있다.

-p 옵션을 이용하여 호스트 1234 포트를 6379 포트로 연결. local host 1234로 접속하면 redis를 사용할 수 있다.

MySQL container

docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  mysql:5.7

-e 옵션으로 환경변수 를 설정하였다. 여기서는 MYSQL_ALLOW_EMPTY_PASSWORD 환경변수를 설정한다.

컨테이너 이름은 --name으로 mysql로 할당하고 백그라운드 모드로 띄우기 위해 -d 옵션을 준다. 

포트는 3306를 호스트에서 그대로 사용한다.

WordPress container

방금 전에 만든 MySQL 컨테이너에 워드프레스 데이터베이스를 만들고 WordPress 컨테이너를 실행할 때 --link 옵션을 이용하여 MySQL 컨테이너를 연결하였다.

--link 옵션은 환경변수와 IP정보를 공유하는데, 링킇나 컨테이너의 IP정보를 /etc/hosts에 자동으로 입력하므로 위드프레스 컨테이너가 MySQL 데이터베이스의 정보를 알 수 있게 된다.

먼저 워드프레스용 데이터베이스를 생성 --> 워드 프레스 컨테이너 실행 

호스트의 8080 포트를 컨테이너의 80 포트로 연결하고 MySQL 컨테이너와 연결한 후 데이터베이스 설정 정보를 환경 변수로 입력하게 된다.

# create mysql database
$ mysql -h127.0.0.1 -uroot
create database wp CHARACTER SET utf8;
grant all privileges on wp.* to wp@'%' identified by 'wp';
flush privileges;
quit

# run wordpress container
docker run -d -p 8080:80 \
  --link mysql:mysql \
  -e WORDPRESS_DB_HOST=mysql \
  -e WORDPRESS_DB_NAME=wp \
  -e WORDPRESS_DB_USER=wp \
  -e WORDPRESS_DB_PASSWORD=wp \
  wordpress

이 과정에서 나는 "mysql -h127.0.0.1 -uroot"로 mysql로 진입이 안돼서 docker exec -it mysql /bin/bash 로 진입하여서 진행하였다.

Tensorflow

docker run -d -p 8888:8888 -p 6006:6006 teamlab/pydata-tensorflow:0.1

이후에 웹브라우저에서 jupyter에 접속을 잘 사용해볼 수 있다!

 

도커 기본 명령어

앞선 설명들은 도커의 run 명령어를 이요하여 컨테이너를 실행했다.

이제는 컨테이너의 상태를 살펴보고 설치된 이미지를 확인해보자!

컨테이너 목록 확인하기 (ps)

docker ps [OPTIONS]

컨테이너 중지하기 (stop)

docker stop [OPTIONS] CONTAINER [CONTAINER ...]

컨테이너 제거하기 (rm)

docker rm [OPTIONS] CONTAINER [CONTAINER ...]

컨테이너를 삭제하려면 컨테이너를 중지시키고 삭제하여야한다. 중지된 컨테이너를 하나하나 삭제하는 것이 귀찮다면

docker rm -v $(docker ps -a -q -f status=exited)

위 명령을 통해 중지된 컨테이너를 한꺼번에 지울 수 있다.

이미지 목록 확인하기 (images)

docker images [OPTIONS] [REPOSITORY[:TAG]]

이미지 다운로드하기 (pull)

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

사실 run 명령어를 입력하면 없는 이미지는 자동으로 다운받는다. 

pull 이미지는 보통 최신버전으로 다시 다운받을 때 사용한다. 

이미지 삭제하기 (rmi)

docker rmi [OPTIONS] IMAGE [IMAGE...]

 

컨테이너 둘러보기

컨테이너 로그 보기 (logs)

컨테이너가 정상적으로 동작하는지 확인하는 방법 중 하나!

docker logs [OPTIONS] CONTAINER

아무 옵션을 주지 않으면 전체 로그를 전부 출력한다.

--tail 옵션을 사용하면 뒤쪽부터 원하는 만큼 로그를 볼 수 있다.

-f 옵션은 실시간으로 로그가 생성되는 것을 확인할 수 있다.

컨테이너 명령어 실행하기 (exec)

docker exec [OPTIONS] CONTAINER COMMAND [ARG ...]

exec 명령어는 실행중인 컨테이너에 명령어를 내리는 역할이다.

 

컨테이너 업데이트

도커에서 컨테이너를 업데이트하려면 새로운 이미지를 다운받고(pull) 기존 컨테이너를 지운 후 (stop, rm) 새 이미지를 기반으로 새 컨테이너를 실행(run)하면 된다.

여기서 컨테이너를 삭제한다는 건 컨테이너에서 생성된 파일이 함께 삭제된다는 것이다. 데이터베이스라면 그동안 쌓은 데이터가 모두 사라진다. 

이러한 상황을 방지하기 위해서 데이터 볼륨을 컨테이너에 추가해서 사용해야한다. 데이터 볼륨을 사용하면 해당 디렉토리는 컨테이너와 별도로 저장되고 컨테이너를 삭제해도 데이터가 지워지지 않는다!

호스트의 디렉토리를 마운트해서 사용하는 방법

# before
docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  mysql:5.7

# after
docker run -d -p 3306:3306 \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
  --name mysql \
  -v /my/own/datadir:/var/lib/mysql \ # <- volume mount
  mysql:5.7

-v 옵션을 사용해서 호스트의 /my/own/datadir 디렉토리를 컨테이너의 /var/lib/mysql 디렉토리로 마운트한다.

 

Docker Compose

위에서는 다소 단순한 설정들을 사용했지만 복잡한 설정을 쉽게 관리하기 위해서 YAML 방식의 설정파일을 이용한 docker-compose 툴을 제공한다.

설치하기

먼저 docker compose의 릴리즈 페이지에 액세스해서 최신 정보를 확인하고, docker compose를 설치하면 된다.

https://github.com/docker/compose/releases

 

Releases · docker/compose

Define and run multi-container applications with Docker - docker/compose

github.com

curl을 사용하여 다운받으면 된다.

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

wordpress 만들기

일단 빈 디렉토리를 하나 만들고 docker-compose.yml 파일을 만들어 아래와 같이 작성한 후 저장한다.

version: '2'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     volumes:
       - wp_data:/var/www/html
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:
    wp_data:
docker-compose up

 


참고

https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html

 

초보를 위한 도커 안내서 - 설치하고 컨테이너 실행하기

초보를 위한 도커 안내서 2번째 글입니다. 도커의 기본적인 내용을 이야기 했던 첫번째 글에 이어 실제로 도커를 설치하고 컨테이너를 실행하면서 도커 명령어를 알아봅니다. 도커를 처음 접하

subicura.com

https://velog.io/@kys6879/%EC%9A%B0%EB%B6%84%ED%88%AC-18.04-Docker-Docker-Compose-%EC%84%A4%EC%B9%98

 

우분투 18.04 Docker & Docker-Compose 설치

Docker 명령어 사용시 sudo쓰기가 번거롭다면. 권한문제 해결.

velog.io

 

'Background > Docker' 카테고리의 다른 글

Docker란 무엇인가 (1)  (0) 2023.08.10