Docker
서비스 운영환경을 묶어서 손쉽게 배포하고 실행하는 경량 컨테이너 기술(go언어로 개발됨)
도커를 지원하는 환경은 현재 리눅스밖에없음(그러므로 맥 & 윈도우는 리눅스기반의 경량 가상머신을 띄워놓고 그안에서 컨테이너를 띄우는것)
도커는 이미지를 받고, 실행중인 이미지를 컨테이너라고함
기본적으로 자원제한을 해주지않으면 호스트컴퓨터의 전체자원을 다 사용함
컨테이너
컨테이너는 가상머신?
vitural box / vmware 처럼 각각의 가상머신을 띄우는거랑 다른가?
→ 다르다
- 가상머신은 하드웨어 자체를 가상화
- 컨테이너는 하드웨어 가상화가 아님(os에서 지원하는 기능을 사용)
- 격리되는 환경에서 실행되는 프로세스라고 생각하면 편함
리눅스라면 실제로 컨테이너 = 호스트의 프로세스 이지만,
맥 & 윈도우는 리눅스 기능을 쓸수없으므로 가상화 기능이 필요.
윈도우쪽에서는 hyper-v나 wsl2를 이용.
(맥 & 윈도우라면 컨테이너 = 가상머신에서 띄운 프로세스)
이미지
특정프로세스가 실행되기 위한 환경
- 파일들의 집합이라고 생각하면 편함.
- 어떤 프로그램을 띄우기위해서 해야하는 선행작업을 명령어&파일로 모아둔것이 이미지 → 이미지를 사용하면 다른컴퓨터에서도 누구든 같은환경이됨.
이미지는 작동되는 상태가 보장됨.
설치
linux :
curl -s http://get.docker.com/ | sudo sh
sudo wget -qO- http://get.docker.com/ | sh <- 이렇게 해도되고(자동설치방법)
centos 라면
#Install
sudo yum install docker
#Docker 서비스 실행
sudo service docker start
#부팅시 자동 실행 설정
sudo chkconfig docker on
docker version 쳐서 클라이언트 / 서버 둘다나오면 설치완료
mac & window : docker for .. 설치 였는데, 윈도우쪽은 부분유료화로 wsl2로 까는게 좋음
도커 컨테이너에 운영체제 설치
- centos : docker run -it centos:7 /bin/sh ← 이미지가 없으면 알아서 받고 실행
- ubuntu : docker run -it ubuntu:16.04 /bin/sh
- alpine : docker run -it alpine:latest /bin/sh (핵심기능만 필요하면 초경량 alpine 이미지 사용- 5mb)
도커 컨테이너에 vi설치
#docker exec -it [container_id] bash
#apt-get update
#apt-get install vim
도커는 Hyper-V기반 가상화로 돌아서 ip가 부팅마다 계속 달라짐
명령어
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...] : 도커실행 / 명령어를 안치면 기본적으로 켰다꺼지지만, 이미지안에 명령어가 들어가있는것들도있음.
옵션 설명
-d detached mode 흔히 말하는 백그라운드 모드 -p 호스트와 컨테이너의 포트를 연결 (포워딩)
-v 호스트와 컨테이너의 디렉토리를 연결 (마운트)
-e 컨테이너 내에서 사용할 환경변수 설정
--name 컨테이너 이름 설정(설정안해주면 도커가 알아서 랜덤으로 생성함)
--rm 프로세스 종료시 컨테이너 자동 제거(진짜 삭제)
-it -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
–link 컨테이너 연결 [컨테이너명:별칭]
docker run -d -p 3305:3306 -e =true --name mysql -v /my/own/datadir:/var/lib/mysql mysql:5.7
도커를 실행하는데 백그라운드 옵션으로 로컬포트 3305을 도커포트 3306로 연결.
~~값 환경변수에 설정. 컨테이너명은 mysql로. /var/lib/mysql파일에 저장되는걸 /my/own/datadir파일에도 저장(업데이트할때 데이터가 전부사라지는걸 방지).
mysql:5.7이라는 이미지 실행 (없으면 받는다).
docker exec -it mysql /bin/sh
docker ps (-a): 컨테이너 목록 확인 (실행됐다가 종료된것도 표시)
docker stop [옵션] 컨테이너 : 실행중인 컨테이너 중지 (컨테이너 id는 ps로 확인) -> 종료일뿐 삭제는 아님!
docker start 컨테이너 : 전에 종료한 컨테이너를 다시 실행
docker restart 컨테이너 : os재실행 처럼 컨테이너 재실행
docker rm [옵션] 컨테이너 : 종료된 컨테이너 완전히 제거
docker images [옵션] : 도커가 다운로드한 이미지 목록보기
docker pull [옵션] 이미지 : 이미지 다운로드
docker rmi [옵션] 이미지 : 다운로드한 이미지 삭제
docker logs [옵션] 컨테이너 : 컨테이너 로그 확인 (--tail 10 맨밑에 10줄만) / (-f 실시간 로그확인)
docker attach 컨테이너 : 컨테이너에 접속하기. (명령을 실행한후 엔터를 한번 더 치면 bash쉘이 표시됨)
docker exec [옵션] 컨테이터 COMMAND [ARG...] : 실행중인 컨테이너에 들어가서 컨테이너파일 명렁어 실행(외부에서 컨테이너 명령 실행)
docker diff 컨테이너id - 첨받은 이미지를 기준으로 실행중인 컨테이너는 어떤 변화가 있는가.
docker tag 이미지명:태그명 새로운이미지명:태그명 : 도커 이미지명 변경(실제로 바꾸진않고 하나더생김)
(예를들어 우분투를 받고 그안에다가 깃을깔았다면 깃이 변경사항이되는것)
run명령어는 새로 컨테이너를 만들어서 실행 / exec는 실행중인 컨테이너에 명령어를 내림.
docker build [옵션] [경로-도커파일이 있는 폴더에서 실행하면 필요없음] 만들이름 . : 이미지를 빌드
docker run -d -p 3305:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql -v /my/own/datadir:/var/lib/mysql mysql:5.7
위 명령어를 실행하여 컨테이너를 올려도 되지만 아래와 같이 docker-compose.yml 파일로 만들어서 실행할 수 있다.
- 장황한 도커 옵션을 한눈에 볼 수 있어 편하다.
version: "3" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
db: # 서비스 명
image: mysql:8.0.17 # 사용할 이미지
container_name: jmlim-mysql # 컨테이너 이름 설정
ports:
- "3306:3306" # 접근 포트 설정 (컨테이너 외부(내컴):컨테이너 내부(도커))
environment: # -e 옵션
MYSQL_ROOT_PASSWORD: "password" # MYSQL 패스워드 설정 옵션
command: # 명령어 실행
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- /Users/jmlim/datadir:/var/lib/mysql # -v 옵션 (다렉토리 마운트 설정)
실행 docker-compose 파일 실행
- docker-compose.yml 작성한 위치에서 실행
- 백그라운드로 실행 시 옵션 -d 붙이면 됨.
- 자세한건 옵션 참고
docker-compose -f 컴포즈파일 up -d
예시
version: '3.8'
services:
local-mysql:
image: 'mysql:5.7'
restart: always
environment:
MYSQL_ROOT_PASSWORD: 654654
MYSQL_DATABASE: testDB
MYSQL_USER: shin
MYSQL_PASSWORD: 654654
TZ: Asia/Seoul
ports:
- "3307:3306"
container_name: local-mysql
command:
- --character-set-server=utf8
- --collation-server=utf8_general_ci
docker volume prune 안쓰는 볼륨 삭제
도커는 기본 디렉토리가 /var/lib/docker인데 여기가 용량 할당된게 별로없어서 바꿔줘야함
참조(https://fliedcat.tistory.com/113)
도커 이미지 생성하기
지금까지는 다 만들어진 이미지만 사용했는데, 내가 원하는 이미지를 생성할 수 도 있다.
예를들어, 우분투 이미지는 git이 포함되어있지않지만, git을 포함시킨 우분투이미지를 만들어서 배포도 가능.
도커는 레이어형식으로 이미지가 구성되어있기때문에, 우분투에 git 레이어를 추가하여 이미지를 만들면됨.
- 우분투 이미지를 다운받고
- 우분투 컨테이너에 접속하여 git 설치
- diff떠봐서 git이 설치되었는지 확인(생략가능)
- 'docker commit 컨테이너id 레파지토리명:태그명' ex) docker commit 92de ubuntu:git
- docker images로 새롭게 만들어진 이미지 확인가능
- 그다음에 docker run -it ubuntu:git bash 으로 컨테이너를 만들면 그안에는 git이 들어가있다..
근데 실제로 위처럼 commit명령어를 쓸일은 거의없고 도커파일을 만들어서 실행함.
Dockerfile
이미지 생성과정을 기술한 도커전용 DSL (즉, 위의 과정을 파일로 정의해놓은것)
// 베이스 이미지 지정
FROM ubuntu:latest
// 파일추가 (=COPY 뭐가 압축도풀고 차이일꺼임)
ADD data.txt /temp/data.txt data.txt를 도커컨테이너의 temp/data.txt로 추가해라 (현재디렉토리 아래만 참조가능)
// 컨테이너 안에서 명령어 실행
RUN apt-get update
RUN apt-get install -y git
// 작업디렉토리 변경 (RUN명령어가 실행되는 디렉토리를 변경)
WORKDIR /tmp
// 환경변수 기본값 지정
ENV AWESOME_VAR FOOBAR
// 컨테이너로 실행시 노출시킬 포트 (-P옵션을 같이사용해야함)
EXPOSE 3315
// 이미지를 실행시 기본으로 실행할 명령어 설정 (ubuntu 같은경우에는 기본명령어가 없어서 명령어를 안치면 자동종료됨 / mysql은 기본명령어가 있어서 자동종료안됨)
CMD 명령어
docker build -t ubuntu:git02 '도커파일이 위치한경로'
'IT > 오픈소스' 카테고리의 다른 글
JPA - 기본 개념 (1) | 2024.01.30 |
---|---|
카프카(Kafka) - 활용정리 (0) | 2023.09.12 |
카프카(Kakfa) 개념정리 (1) | 2023.09.11 |
네티(Netty) 기본정리2 (0) | 2022.02.22 |
네티(Netty) 기본정리 (0) | 2022.02.06 |
댓글