CI(Continuous Integration), CD(Continuous Delivery / Continuous Deployment)
기존의 서비스를 배포하는 과정에서는 n개의 서버가 클러스터가 되어있다면 "손배포"를 통해 상당한 시간 등의 리소스를 소모했었다.
하지만, Docker는 모두 같은 환경에서 테스트 및 배포 테스트를 할 수 있게 만들어 주었고, 이 과정을 자동화하기 까지 해주었기에 개발자의 시간을 많이 줄여줄 수 있게 되었다.
Docker : Container 관리 가능
Container Ochestration 기술 발달 -> Kubernetes 기술 발전.
Docker의 장점
- 애플리케이션 개발과 배포 편의성
- Docker Container의 변경이 host OS에는 영향이 없음.
- CI/CD에서 지속적인 통합 과정의 테스트에서 Docker를 활용하게 됨.
- 어떤 서버에 올리더라도 같은 환경으로 구성된 컨테이너로 동작하기 때문에 표준화된 배포가 가능함.
- 여러 애플리케이션의 독립성과 확장성 확보
- Docker가 사실상 가상화의 표준인 상황.
Docker 설치 - mac 기준
1. 홈브루 설치
홈브루란?
brew(homebrew)는 각종 커맨드라인 프로그램과 일반 애플리케이션을 손쉽게 설치해주는 Mac용 패키지 매니저이다. 리눅스의 apt
나 yum
과 비슷하며 다양한 프로그램을 복잡한 빌드과정 없이 손쉽게 설치하고 업데이트, 관리도 간단하게 진행할 수 있다.
본격적인 설치
https://brew.sh/ko/ 로 이동
위 사이트로 이동하여 homebrew 설치
terminal에 다음 코드 입력하여 설치
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
2. docker 설치
docker, docker-compose 버전 확인
# docker for mac설치
brew install docker docker-compose
# docker version 확인
docker --version
# docker compose version 확인
docker-compose --version
docker, docker-compose 버전 확인
docker Desktop 설치
https://docs.docker.com/desktop/install/mac-install/ 로 이동하여 본인 chip에 따라 설치.
도커 application으로 집어넣기
docker 실행 테스트
docker info
Container 실행 테스트
컨테이너가 제대로 올라가는지 확인을 위해 nginx 이미지를 docker에 올려 테스트를 해보자.
# nginx 이미지 다운받기
docker image pull nginx:1.25.3-alpine
docker images
docker image history nginx:1.25.3-alpine
docker run -d -p 8001:80 --name webserver01 nginx:1.25.3-alpine
docker ps | grep webserver01
docker port webserver01
curl localhost:8001
1. nginx를 다운받아 현재 docker에 설치된 image를 확인해보자.
2. docker image history를 확인해보자.
3. docker에 이미지를 실행시켜보자
docker run -d -p 8001:80 --name webserver01 nginx:1.25.3-alpine
port는 8001:80에 webserver01 이라는 프로세스 이름으로 nginx 를 실행시키겠다는 뜻이다.
해쉬값이 나오는 것을 확인할 수 있다.
4. grep으로 확인해보자.
5. 다음 명령어로 우리가 실행시킨 nginx의 포트도 확인할 수 있다.
6. curl이라는 명령어로 포트를 찔러 확인할 수 있다. 아래 사진은 브라우저에서 해당 포트에 접근한 화면이다.
Docker image 관리
- Docker 이미지는 container 런타임에 필요한 바이너리, 라이브러리 및 설정 값 등을 포함하고, 변경되는 상태값을 보유하지 않고(stateless) 변하지 않는다.(Immutable, Read-Only)
- stateless: 상태를 저장하지 않기 때문에 다른 환경에서도 동일한 애플리케이션 실행이 가능함.(애플리케이션과 관련된 모든 파일과 라이브러리를 가지고 있음.
- 불변성(Immutable): 이미지가 한번 생성되면 변경할 수 없음.(변경하고 싶다면 삭제하고 다시 다운받아야함.)
- 도커 이미지는 필요한 파일만 포함하고 있음. 수정 x
Docker hub에 대한 이해
hub.docker.com 에서 기본적으로 이미지를 제공받거나 이미지를 업로드하여 제공할 수 있다. 이 것도 깃허브처럼 Private Registry 서버를 통해 받아올 수도 공유할 수도 있음.
마치 패키지 매니저가 무엇을 다운받을 때 받아오는 허브같은 곳임.
Docker 명령어 사용해보기
docker pull: Docker 이미지 내려받기
# docker [image] pull [options] name:[tag]
# 최초에는 docker.io가 default registry로 설정됨.
docker pull debian[:latest] ---(1)
docker pull library/debian:10 ---(2)
docker pull docker.io/library/debian:10 ---(3)
docker pull index/docker.io/library/debian:10 ---(4)
docker pull nginx:latest ---(5)
# private registry 나 클라우드 저장소의 이미지를 받는 경우
docker pull 192.168.0.101:5000/debian:10 # 현재는 실제로 동작하지 않음 ---(6)
docker pull gcr.io/google-samples/hello-app:1.0 ---(7)
(1) : 데비안 다운로드 (latest - 최신판이 default이므로 생략 가능)
(2),(3),(4) : 특정 라이브러리에서 버전을 받아올 수 있음
(5) : 위에서는 최신 버전 nginx가 아니므로 최신 버전을 받아봄
(6), (7) : 클라우드 저장소의 이미지를 받을 수 있음.
docker image inspect: Docker 이미지 구조 확인
inspect를 통해 다운 받은 이미지의 내부 구조 정보를 json 형태로 확인이 가능함.
docker image inspect nginx:1.25.3-alpine
---------------------------------------------------------
docker image inspect --format="{{.Os}}" nginx:latest
linux
docker image inspect --format="{{.RepoTags}}" nginx:latest #태그 확인
[nginx:latest]
docker image inspect --format="{{.ContainerConfig.ExposedPorts}}" nginx:latest #포트확인
map[80/tcp:{}]
docker image inspect --format="{{.RepoTags}} {{.Os}}" nginx:latest #복수 확인
[nginx:latest] linux
docker image history: Dockerfile에 대한 정보
아래 명령어를 입력하면 여러 개의 계층 구조로 된 도커 이미지를 확인할 수 있다.
docker image history nginx:1.25.3-alpine
Docker login/logout : hub.docker.com에서 회원가입 후 실행
docker login
Log in with your Docker ID or email address to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one.
You can log in with your password or a Personal Access Token (PAT). Using a limited-scope PAT grants better security and is required for organizations using SSO. Learn more at https://docs.docker.com/go/access-tokens/
Username: {자신의 계정}
Password: {자신의 암호}
Login Succeeded
docker logout
Removing login credentials for https://index.docker.io/v1/
테스트한 이미지 삭제
아래 화면을 보면 아까 실행했던 webserver01이 아직 실행중임을 알 수 있다. 필요없기 때문에 오른쪽 휴지통 버튼을 클릭하여 정지시키고 삭제해주자.
Docker Container와 Container 를 다루는 CLI
- Docker Image : 컨테이너에 대한 OS, Application, Library 등등의 정보가 포함된 것.
- Containder: Image를 실행시킨 상태, 여러 개를 도커안에 실을 수 있음.
Docker 이미지/Container 관련 명령어
컨테이너의 상태
- Runnning : 컨테이너가 실행중인 상태.
- Paused : 컨테이너가 잠시 정지중인 상태.
- Stopped : 컨테이너가 정지인 상태.
Docker 생애 주기(LifeCycle)
Docker Container 수동 생성
docker create 라는 명령어를 사용해 컨테이너를 실행시키지 않고 생성만 할 수 있다.
예시로 우분투 22.04를 생성해보자.
docker pull ubuntu:22.04
docker images
=
잘 다운로드된 것을 확인할 수 있다.
받은 이미지로 `ubuntu2204test`라는 이름의 컨테이너를 생성해보자.
docker create –ti --name ubuntu2204test ubuntu:22.04
다음 명령어로 도커에서 존재하는 컨테이너의 상태를 확인할 수 있다.
docker ps –a
docker container를 다음 명령어로 실행시킬 수 있다.
docker start ubuntu2204test
Ubuntu2204test
docker attach ubuntu2204test
이제 다음은 컨테이너를 실행시키고 컨테이너 안으로 들어가보자.
attach 하게 되면 사용자 이름이 root@~로 바뀌면서 컨테이너 내부로 들어간 것을 확인할 수 있다. 새로운 터미널에서 확인하면 켜져서 실행중인 것이 확인 할 수 있다.
이제 컨테이너 내부에서 'exit'을 통해 빠져나오면 꺼지게된다. 확인해보자.
이 모든 과정(create -> start -> attach)을 한번에 하고 싶다면 `run` 명령어를 사용하면 된다.
docker run -ti --name=ubuntu2204test2 ubuntu:22.04 /bin/bash
확인해보면 기존 test는 꺼져있고, test2는 실행중인 것을 확인할 수 있다.
실행중이라는 것은 프로세스로 켜지는 것이기 때문에 쉘 명령어로 실행중인 프로세스를 확인할 수 있다.
ps -ef | grep ubuntu2204test2
이미지 직접 만들어서 올려보기
이미지를 직접 빌드할 수 있다. 다음 명령어는 docker image를 직접 빌드할 수 있는 명령어이다. 빌드를 하게 되면 아래 사진처럼 로그가 나오고 빌드가 된다.
docker buildx build -t node-test:1.0 .
아래 명령어를 통해 빌드된 이미지를 찾을 수 있다. grep은 images 중에서 node-test를 찾는 명령어이다.
docker images | grep node-test
이미지 history를 확인해보면 6060번 포트에서 열린것을 확인할 수 있다.
docker image history node-test:1.0
이제 도커 직접 만든 이미지를 올려 실행시켜보자. 자세한 옵션은 아래서 알아보자.
docker run -itd -p 6060:6060 --name=node-test -h node-test node-test:1.0
docker ps | grep node-test
curl http://localhost:6060
실행한 앱의 로그 또한 볼 수 있다.
docker logs node-test
docker run 자주 사용하는 옵션
-d: detached mode; 백그라운드 모드
-p: 호스트와 컨테이너의 포트를 연결(포워딩)
-v: 호스트와 컨테이너의 디렉토리를 연결(마운트)
-e: 컨테이너 내에서 사용할 환경변수 설정
-name: 컨테이너 이름 설정
-rm: 프로세스 종료 시 컨테이너 자동 삭제
-ti: -i 와 -t 를 동시에 사용한 것으로 터미널 입력을 위한 옵션
컨테이너의 정보를 확인할 수도 있다. 만약 docker stat을 아무런 옵션 없이 사용하면 stream으로 계속 나오게 된다.
쌓이는 로그의 경우에는 로컬의 ./ 디렉토리에 저장이 된다.
컨테이너 내부를 사용하고 싶다면 다음과 같이 사용하면 된다.
docker inspect [container]
docker inspect node-test
도커 컨테이너 정리하기
# 터미널1, 도커 상태 확인
docker stats
# 터미널2, 도커 프로세스 이벤트 확인
docker events
# 터미널3, docker start
docker stop node-test -------- 노드 정지
docker ps –a
docker start node-test -------- 노드 시작
#
docker pause node-test -------- 노드 일시정지
docker unpause node-test -------- 노드 다시시작
docker ps -a
Docker exit code 확인해보기
- 0 : Docker Process가 수행해야 할 모든 Command 또는 Shell을 실행하고 정상 종료
- 255 : Docker Image에 정의된 EntryPoint 또는 CMD가 수행이 완료되었을 경우 발생
- 125 : Docker run 명령어의 실패로 실제 docker process가 기동되지 않음
- 126 : Docker Container 내부에서 Command를 실행하지 못할 경우 발생
- 127 : Docker Container 내부에서 Command를 발견하지 못하였을 경우 발생
- 137 : kill -9로 인해 종료 됨
- 141 : 잘못된 메모리 참조하여 종료 됨
- 143 : Linux Signal로 정상 종료 됨
- 147 : 터미널에서 입력된 정지 시그널로 종료 됨
- 149 : 자식 프로세스가 종료 되어 종료 됨
Docker container, image, system 정리하기
prune 명령어를 사용하면 모든 값을 사라지게 할 수 있다.
# 중지된 컨테이너를 포함하여 모든 컨테이너 리스트
docker container ls -a
#
docker container prune
#
docker image prune
# 남아 있는 이미지 리스트 확인 – 실행 중인 컨테이너의 이미지 등
docker image ls
# 사용하지 않는 도커 이미지, 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제
docker system prune
'Infra > CI&CD' 카테고리의 다른 글
Travis CI 배포 자동화 (3) - Travis CI, AWS S3, CodeDeploy 연동 (0) | 2022.08.21 |
---|---|
Travis CI 배포 자동화 (2) - S3 버킷 (0) | 2022.08.21 |
Travis CI 배포 자동화 (1) - Travis 설정하기 (0) | 2022.08.21 |