출처
도커란?
Go언어로 작성된 리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼이다.
다시 말해 특정한 서비스를 패키징하고 배포하는데 유요한 오픈소스 프로그램이다,
컨테이너에는 라이브러리, 시스템 도구 , 코드 , 런타임 등 소프트웨어를 실행하는데
필요한 모든것이 포함되어 있다.
가상머신에 비해 꼭 필요한 것만 담겨서 구동되기 때문에 이미지를 만들 경우 용량이 대폭 줄어든다.
도커를 왜 사용할까?
1. 애플리케이션 독립성을 가진다. 호스트 OS, 다른 컨테이너와도 독립된 공간을 보장받아 충돌이 발생하지 않는다.
2. 컨테이너 내부에 작업 후 배포하려 한다면 도커 이미지로 만들어서 운영서버에 전달만 하면 된다.
3. 마이크로 서비스 구조로 변화가 쉽다. 컨테이너 하나당 하나의 기능을 제공하는 모듈로 만드는 등 조정이 가능하다.
다시 말해, Docker을 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포, 확장할 수 있다.
라고 한다.
도커 이미지와 도커 컨테이너
도커라이징(Dockerizing) ?
Docker 컨테이너를 사용하여 응용프로그램(application)을
패킹(packing), 배포(deploying), 실행(running) 하는 전 과정을 말한다.
한 마디로 우리가 작업하던 Docker 관련 일들이 모두 도커라이징 과정의 일부라고 보면 된다.
윈도우
도커 데스크탑이다.
https://www.docker.com/products/docker-desktop/
다음은 CMD 창에서 알아보자
일단 이미지를 PULL 명령어로 가져와보자
<!-- 도커 이미지란? -->
# 1. 개념
#도커 사이트
📍 도커 사이트 : GitHub 나 Bitbucket과 같은 소스코드 관리 툴과 연계하여 코드를 빌드하는 기능이나 실행 가능한 애플리케이션의 이미지를 관리하는 Docker의 공식 리포지토리 서비스입니다.
https://hub.docker.com/
여기서 여러분의 이미지를 확인할 수 있어요.
간단하게 ‘nginx’로 검색해보면 official과 verified publisher로 정해져있습니다. official은 해당 제조사가 만든 공식 이미지이며 나머지는 특정 유저가 만들어 놓은 이미지입니다.
# docker 검색
[root@localhost]# docker search [image]
[root@localhost]# docker search nginx
# 레지스트리 , 저장소 , 이미지
레지스트리 : 레지스트리 서버의 IP 주소 또는 도메인 이름 (default : dockerhub)
이 레지스트리는 저장소라고 하면 쉽습니다. 내가 사용하는 이미지가 도커허브에서 다운을 받았거나 추후에 설명하는 도커파일로 내가 만들어서 내부에서 만든 레지스트리일 수도 있습니다.
저장소 : 하나 이상의 컨테이너 이미지를 저장하는 장소입니다. official한 repository 이름은 library입니다.
이미지 : 컨테이너의 기본이 되는 이미지, 주로 이미지의 역할과 관련된 이름을 붙이며 생략할 수 없습니다.
이미지는 이미지 자체로는 사용할 수 없고 컨테이너에 추가해야지만 사용할 수 있는 패키지 같은 느낌입니다.
태그 : 이미지의 버전을 기록합니다. 만약에 태그를 생략하면 도커 엔진은 이미지의 태그를 latest로 인식하고 해당 버전을 기록합니다. latest는 말 그대로 최신 이미지를 의미하겠죠?
# docker 검색의 사람들이 좋아하는 ? 검색
# 여기서 stars는 즐겨찾기 수입니다. 그만큼 인기많으면 별점 받잖아요 (벌점아님). 여러분이 원하는 이미지 기준에 따라 찾으시면 됩니다. 보통 official이 별점이 많습니다.
[root@localhost]# docker search nginx -f stars=10
<!-- 도커 이미지관리 -->
1) 도커 이미지 관리
도커 이미지는 내가 만들지 않는 이상 공식적인 Docker Hub등 Docker Registry로 부터 Docker 이미지를 다운로드합니다
# [명령어]
docker [이미지명] pull
docker image pull
나에게 끌고온다라는 느낌으로 생각하시면 쉬울 듯합니다!
이미지를 다운 받게 되면 항상 ‘확인’ 하는 습관을 들여야합니다.
docker image ls = docker images 로 찾아볼 수 있습니다.
# 이미지 확인하기
# 추가적인 명령어도 있습니다.
# --digests : 다이제스트(Hash value) 출력 결정
# --no-trunc : 결과 필드 정보를 자르지 않고 모두 출력
# --quiet or -q : Docker 이미지 ID만 출력
[root@localhost]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 0e901e68141f 3 weeks ago 142MB
wordpress latest 744143078625 2 months ago 605MB
[root@localhost]# docker images --no-trunc
[root@localhost]# docker images -q
# 다운받은 이미지 확인
[root@localhost]# docker image inspect nginx
# 이렇게 상세 정보로 찾으면 추후에 도커파일이 위치한 디렉토리나 어떤 OS운영체제로 돌아가는지도 알 수 있기 때문에 나중에 트러블 슈팅할 때도 좋겠죠?
# 나는 이미지를 다운받았어도 구분하기 위한 무언가가 필요할 수 있잖아요 그래서 우리는 태그를 사용합니다.
# 원래 이미지의 IMAGE ID( 0e901e68141f) 새로운 이미지의 IMAGE ID가 동일하죠? 다른 이미지가 아니라 동일한 이미지로 이미지에 별명만 새롭게 붙인 것입니다. 그렇기 때문에 이미지 자체가 변경 된 것은 아닙니다.
# docker image tag [이미지] [레포지토리] : 태그
[root@localhost]# docker image tag nginx hwi/web-sever:1.0
[root@localhost]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hwi/web-sever 1.0 0e901e68141f 3 weeks ago 142MB
nginx latest 0e901e68141f 3 weeks ago 142MB
이미지를 레포지토리:태그로 같은 이미지를 만든다? 라는 느낌인데 한마디로
레포지토리 : 이미지 이름
태그 : 이미지의 버젼
이라는 뜻이라고 하면 되겠다
1.0은 1.0 버젼
latest 는 최신 버젼 이란 뜻이다.
이번에는 이미지를 활용해서 컨테이너를 만들어 보자
# 컨테이너 만들기 docker run [옵션] 이미지명[:태그명] [인수]
docker run --name [만들 컨테이너 이름] -it [pull 시킬 이미지]
# 컨테이너 port 번호로 실행
docker run -p 8080:80 nginx:latest
# docker run : 컨테이너를 시작하고 COMMAND를 실행
# 로컬에 이미지가 있다면 해당 이미지로 실행하고, 없으면 도커허브에서 다운로드 후 실행
# -d 옵션을 사용해 사용자가 직접 컨테이너 안으로 접근하지 않고, 컨테이너의 COMMAND를 백그라운드로 실행할 수 있습니다.
docker run -dit --name [컨테이너명] [이미지명]
# 컨테이너 이름 바꾸기
docker rename [현재 이름] [바꿀 이름]
# 실행(Up) 중인 컨테이너들의 목록을 확인
docker ps
# (all) 옵션을 함께 써주면 실행 중이지 않은 컨테이너를 포함하여 전체 컨테이너 목록을 출력합니다.
docker ps -a
# --no-trunc 옵션을 함께 써주면 컨테이너 ID 전체를 보여줍니다.
docker ps --no-trunc
# 컨테이너 시작 : docker start
# -ai 옵션 : 해당 컨테이너 내부로 접근
docker start -ai [컨테이너명]
# 실행 중인 컨테이너를 종료 : docker stop
docker stop [컨테이너명]
# 컨테이너 접속
docker exec -it [컨테이너명] /bin/bash
위와 같이 -it옵션을 사용하여 접속할수 있고
-d 옵션을 통해 백그라운드로 실행 시킬수 도 있다.
다음은 컨테이너와 이미지를 삭제 시켜보자
# docker rm
# 컨테이너를 삭제
# 동작 중인(Up) 컨테이너를 삭제하려면 stop 명령어를 사용해 종료(Exited) 후 삭제하거나,
# rm 명령어에 -f 옵션을 사용해 삭제할 수 있습니다.
root@DH:~# docker rm test
Error response from daemon: You cannot remove a running container e900da8137a077c9a82f3936899e9ac0d3f167a6a6e759cfacdcce17ef940979. Stop the container before attempting removal or force remove
(실행중이므로 삭제를 할수 없습니다.)
에러시
root@DH:~# docker rm -f [컨테이너명]
# 이미지 삭제
docker rmi [이미지명]
컨테이너의 이력을 알아보자
# docker diff
# 컨테이너가 생성된 시점부터 변경된 이력을 확인
# writable layer의 변경 여부를 확인
# A(Add)는 추가된 이력, C(Change)는 변경된 이력, D(Delete)는 삭제된 이력을 의미합니다.
docker diff [컨테이너명]
이번에는 실행중인 컨테이너의 로그를 알아 볼수도 있다.
# 실행중인 컨테이너의 로그
docker logs [이미지명]
사실상 여기까지만 알아도 될 듯 싶다??
여러가지의 옵션들과 명령어들이 있는데 가장 기본적인 것들만 해보았다
나는 이러면서 의문점이 들었다
그래서 이미지는 어떻게 만드는데????
이미지를 만드는 방법을 간단히 알아보자
이걸 흔히 도커라이징이라 하는 갑다.
나는 흔히 EC2 배포할때 war 파일로 압축해서 배포를 진행했는데
그것과 똑같다고 생각하면 된다.
먼저 war 파일 하나가 있다고 가정해보자
나는 이것을 바로 docker 에서 이미지화해서 실행시켜 볼것이다.
위의 이미지에서 Dockerfile 이라는 파일하나가 보일것이다.
이것이 도커라이징을 할 설정파일이다.
VSC 를 열어 Dockerfile을 만들어 그 안에
# 사용할 Java의 베이스 이미지를 지정합니다.
FROM openjdk:17
# 컨테이너 내에서 애플리케이션을 실행할 디렉토리를 생성합니다.
WORKDIR /app
# 빌드된 JAR 파일을 컨테이너 내부로 복사합니다.
COPY ./demo-0.0.1-SNAPSHOT.war /app
EXPOSE 8080
# 컨테이너가 시작될 때 실행될 명령을 지정합니다.
CMD ["java", "-jar", "/app/demo-0.0.1-SNAPSHOT.war"]
요런 명령문을 넣어주고
해당 디렉토리에서 CMD 창으로
# 빌드하기
# docker build
# -t : 태그 옵션
# java-app : 태그 이름
# . : 현재 경로
docker build -t java-app .
# 실행하기
# docker run
# -d : 백그라운드에서
# -p : port 번호
# 8080:8080 : 외부포트 : 내부포트
# --name java-app: 컨테이너 이름 옵션
# java-app : [이미지이름]
docker run -d -p 8080:8080 --name java-app java-app
요런 명령문을 넣어주게 되면
해당 로컬에서 이미지가 만들어 지게 될것이다.
그럼 하나하나 파헤쳐보자
Dokcerfile 이란 ?
Docker 에서 알아볼수 있게 만든 설정파일이다.
이 파일을 이용하여 도커 라이징을 한다.
꼭 이름을 Dockerfile 또는 Dockerfile.1 등으로 해주어야 한다.
FROM 명령문이란?
어떤 이미지를 기반으로 만들것인지를 알려준다.
WORKDIR 명령문이란?
/app 이라는 폴더 하나를 만들어라 라는 것이다.
COPY 명령문이란?
해당 윈도우 폴더내에 있는 파일하나를 도커 내부에 옮기는 작업이다
따라서 위의 war 파일 하나가 /app 이라는 폴더 안으로 쏙 들어가게 될것이다.
EXPOSE 명령문이란?
내부 포트 하나를 만들어 주는 과정이다.
내부포트와 외부 포트?
도커 이미지들은 내부포트를 가지고 있는데
이때 외부 포트가 없다면 도커 컨테이너 안으로 들어갈 수 없다.
한마디로 컨테이너에 빵꾸 하나 없으면 들어갈 문이 없다.
따라서 컨테이너를 기본적으로 port 번호를 활용하여 뚫어 들어간다.
CMD 와 RUN 명령어란?
둘 다 비슷한데,
RUN 은 흔히 JDK 나 unzip 과 같은 것들을 install 할 때 많이들 쓰인다.
CMD 는 Docker 컨테이너를 run 시킬때 컨테이너 안의 어떤 파일을 실행시킬때 사용한다.
그럼 컨테이너를 실행 시키면?
CMD 명령어가 반응하여 war 파일이 실행이 될것이다.
마치며
여기까지만 하더라도 Docker의 간단한 사용법 정도는 익힌거 같다..
여러가지의 옵션 명령어 등과 Linux 기반 명령어 들은 알아 두면 좋을것같다.
Readme.md 파일을 하나 올려두겠다.
'Docker' 카테고리의 다른 글
Docker - Java -jar 로 오라클 지갑과 함께 실행해보자 (1) | 2023.12.15 |
---|---|
Docker - tomcat 쉬운 버전 (0) | 2023.12.15 |
Docker - tomcat (0) | 2023.12.15 |
Docker - nginx (0) | 2023.12.15 |