sudo docker version
Client: Docker Engine - Community
Version: 25.0.1
API version: 1.44
Go version: go1.21.6
Git commit: 29cf629
Built: Tue Jan 23 23:09:23 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 25.0.1
API version: 1.44 (minimum version 1.24)
Go version: go1.21.6
Git commit: 71fa3ab
Built: Tue Jan 23 23:09:23 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.27
GitCommit: a1496014c916f9e62104b33d1bb5bd03b0858e59
runc:
Version: 1.1.11
GitCommit: v1.1.11-0-g4bccb38
docker-init:
Version: 0.19.0
GitCommit: de40ad0
드디어 컨테이너를 실행해 볼 단계이다 !
지금껏 이론으로만 접한 컨테이너를 드디어 띄워보자 !
도커를 활용하면 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있다고 했다.
여러가지를 띄워볼건데 이전에 도커 실행 명령어를 간단히 보고 넘어가자
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
옵션 | 설명 |
---|---|
-d | detached mode 흔히 말하는 백그라운드 모드 |
-p | 호스트와 컨테이너의 포트를 연결 (포워딩) |
-v | 호스트와 컨테이너의 디렉토리를 연결 (마운트) |
-e | 컨테이너 내에서 사용할 환경변수 설정 |
–name | 컨테이너 이름 설정 |
–rm | 프로세스 종료시 컨테이너 자동 제거 |
-it | -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션 |
–link | 컨테이너 연결 [컨테이너명:별칭] |
ubuntu:16.04
환경의 컨테이너를 생성하고 내부로 들어가기!
docker run ubuntu:16.04
Output
run
명령어를 사용하면 사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드(pull
)를 한 후 컨테이너를 생성(create
)하고 시작(start
)ubuntu:16.04
이미지를 다운받은 적이 없기 때문에 이미지를 다운로드 한 후 컨테이너가 실행되었다./bin/bash
명령어를 입력해서 ubuntu:16.04
컨테이너를 실행Input
docker run --rm -it ubuntu:16.04 /bin/bash
—rm
: 프로세스 종료 시 컨테이너 자동 제거-it
: -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션/bin/bash
: 컨테이너 내부에 들어가기 위해 bash 쉘을 실행Output
exit
: exit 로 쉘을 종료하면 컨테이너도 같이 종료된다.cat /etc/issue
을 실행해보면 우분투 리눅스 인 것을 확인할 수 있다.Redis 컨테이너를 생성하고 내부로 들어가기!
Input
docker run -d -p 1234:6379 redis
-d
: detached mode(백그라운드 모드)로 실행하기 위한 옵션-p
: 컨테이너의 포트를 호스트의 포트로 연결 (6379 포트를 1234로 연결)Output
-d
옵션을 적었기 때문에 컨테이너를 실행하면 컨테이너의 ID(1990~~)을 보여준다.-p
: 컨테이너의 6379포트를 호스트의 1234포트로 연결하였고 localhost의 1234포트로 접속하면 redis를 사용할 수 있다.mysql 서버 컨테이너 생성하고 내부로 들어가기!
MySQL Docker hub 페이지에 접속하면 간단한 사용법과 환경변수에 대한 설명이 있다.
Input
docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7
3306포트
를 호스트에서 그대로 사용-d
: detached mode(백그라운드 모드)로 실행하기 위한 옵션-e
: 환경변수 설정MYSQL_ALLOW_EMPTY_PASSWORD
환경변수를 설정—name
: 컨테이너에 읽기 어려운 ID 대신 쉬운 이름을 부여 (컨테이너의 이름은 mysql
로 할당)
--name
옵션을 생략하면 도커가 자동으로 이름을 지어 줍니다. 이름은 유명한 과학자나 해커의 이름과 수식어를 조합하여 랜덤으로 생성합니다. (ex - boring_wozniak) 우리나라 과학자 장영실도 등록되어 있습니다.
Output
Wordpress 컨테이너 생성하고 내부로 들어가기!
워드 프레스는 데이터 베이스가 필요하다.
바로 전 생성했던 mysql 컨테이너를 이용할 것이다.
mysql 컨테이너에 워드프레스 데이터 베이스를 만들고
wordpress 를 실행할 때 —link
옵션을 사용해 mysql 컨테이너랑 연결해보자.
우선 mysql 컨테이너에 워드 프레스용 데이터 베이스를 생성해보자
Input
# mysql에 접속
mysql -h127.0.0.1 -uroot
#워드 프레스용 데이터 베이스 생성
create database wp CHARACTER SET utf8;
#권한 부여
grant all privileges on wp.* to wp@'%' identified by 'wp';
#변경사항 적용
flush privileges;
#mysql 나오기
exit
GRANT ALL PRIVILEGES ON wp.* TO wp@'%' IDENTIFIED BY 'wp';
:GRANT
: 사용자에게 권한을 부여하는 MySQL 명령어입니다.ALL PRIVILEGES
: 모든 권한을 부여하는 키워드로, 사용자가 지정된 데이터베이스에 대해 모든 작업을 수행할 수 있도록 합니다.ON wp.*
: 권한을 부여할 데이터베이스와 테이블을 지정합니다. 여기서 wp.*
는 wp
데이터베이스 내의 모든 테이블을 의미합니다.TO wp@'%'
: 권한을 받을 사용자와 해당 사용자의 호스트를 지정합니다. wp
는 사용자 이름을 나타내며, '%'
는 모든 호스트를 나타냅니다. 따라서 '%'
은 어떤 호스트에서든 접속할 수 있도록 허용합니다.IDENTIFIED BY 'wp'
: 사용자를 식별하는 비밀번호를 설정합니다. 여기서는 'wp'
로 지정되었습니다.FLUSH PRIVILEGES;
:다음은 워드프레스 컨테이너를 실행해보도록 하겠습니다.
Input
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
8080포트
를 컨테이너의 80포트
로 연결하고Output
tensorflow서버 컨테이너 생성하고 내부로 들어가기!
설치하는 이미지는 python과 함께 numpy, scipy, pandas, jupyter, scikit-learn, gensim, BeautifulSoup4, Tensorflow가 설치되어있다
Input
docker run -d -p 8888:8888 -p 6006:6006 teamlab/pydata-tensorflow:0.1
Output
생성해 두었던 mysql 컨테이너의 로그를 확인해보자
Input
docker logs mysql
Output
-f
, -tail
옵션을 줄 수도 있다.ctrl + c
로 로그 파일에서 빠져 나올 수 있다.docker exec -it mysql mysql -uroot
새로운 버전으로 컨테이너를 업데이트 하기 위해서는 아래와 같은 과정을 거친다.
근데 만약 데이터베이스 컨테이너를 업데이트한다고 하면 기존 업데이트를 삭제하면서 내부 데이터가 삭제될 것이다.
이런 상황을 방지하기 위해서는 데이터는 컨테이너 내부가 아닌 외부 스토리지에 저장 해야 한다. 가장 좋은 방법은 AWS S3같은 클라우드 서비스를 이용하는 것이 좋다. 그렇지 않다면 데이터 볼륨을 추가해서 사용해야 한다. 데이터 볼륨을 사용하면 해당 디렉토리는 컨테이너와 별도로 저장되고 컨테이너를 삭제해도 데이터가 지워지지 않는다.
데이터 볼륨을 사용하는 방식이 여러가지가 있지만 나는 호스트 디렉토리를 마운트해서 사용하는 방법으로 해보겠다.
마운트
리눅스는 하드 드라이브, CD-ROM, USB 등의 물리적인 장치들이 파일 시스템으로 인식되어야 사용할 수 있다. 이러한 하드웨어 장치를 액세스 하기 위해서는 리눅스의 특정한 위치 (디렉토리)에 연결 (할당)을 시켜주어야 한다. 이러한 과정을 마운트라고 한다.
/var/liv/mysql
디렉토리에 있는 모든 데이터 베이스 정보가 담기므로 호스트의 특정 디렉토리로 연결해보자docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql -v /my/own/datadir:/var/lib/mysql mysql:5.7
-v
옵션을 사용/my/own/datadir
디렉토리를 컨테이너의 /var/liv/mysql
디렉토리로 마운트/my/own/datadir
디렉토리에 저장되고 컨테이너를 삭제해도 데이터는 사라지지 않음단일 서버에서 여러개의 컨테이너를 하나의 서비로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리도구
복잡한 설정을 쉽게 관리하기 위해 YAML방식의 설정파일을 이용
리눅스 docker compose 설치 명령어
curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
아래와 같이 오류가 난다면 docker-compose에 권한이 없어서 생기는 오류이므로 권한을 주자
sudo chmod -R 777 /usr/local/bin/
#7은 읽기 쓰기 및 실행 권한을 말한다.
#세 수는 하나는 소유자 하나는 그룹하나는 기타를 의미한다.
그래도 안된다면 공식문서를 참고하자
나는 공식문서에서 sudo apt install docker-ompose
로 설치하라길래 이 명령어도 입력해주었다.
버전 확인
기존에 만들었던 wordpress를 compose를 이용해서 다시 만들어보자
빈 디렉토리 만들기
# 디렉토리 생성 디렉토리 이름은 temp
mkdir temp
# 생성한 디렉토리로 이동
cd temp
docker-compose.yml 파일 만들기
# docker-compose.yml 파일 생성
touch docker-compose.yml
# 파일 목록 확인
ls
# 파일 읽기
vi docker-compose.yml
# 키보드 i를 눌러 편집모드로 전환
# esc 눌르면 읽기보드로 전환
# 읽기모드에서 :q! 저장하지 않고 파일 나오기
# 읽기모드에서 :wq! 저장하고 나오기
입력하기
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:
compose 실행하기
Input
docker-compose up
Output
이번 글에서는 컨테이너를 실행하고 살펴보았다.
다음 글에서는 직접 이미지를 만들고 배포해보도록 하자
다음게시글 -> [Docker] Docker 이미지 만들고 컨테이너 생성하기
📎 참고 링크
https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html