본문 바로가기

Tech Stack/docker

docker의 이해

Vitualization

 

- 가상화 - 하나의 물리적인 머신에서 여러개의 운영체제를 실행

 

클라우드 컴퓨팅에서의 가상화

- 운영체제내에 가상머신을 생성하는 하드웨어 가상화

리소스를 줄이거나 늘리거나 하는 작업도 가능

 

가상화의 장점

- 유연성

- 민첩성

- 내결함성

- 비용절감

 

 

하드웨어 위에다가 어플리케이션에서 확장하여

 

 

  1. Docker를 사용하는 이유

애플리케이션을 관리하는 것과 동일한 방식으로 인프라를 관리할 수 있음

빠르고 일관된 애플리케이션 제공

애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼 개발자가 애플리케이션과 서비스를 제공하는 로컬 컨테이너를 사용하여 표준화된 환경에서 작업할 수 있도록 하여 개발 수명 주기를 간소화

 

 

 

                     기능

용어

 

docker daemon
Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리 컨테이너가 정상적으로 수행될 수 있게 실행 환경 제공 컨테이너 빌드, 실행 및 배포와 같이 Docker 클라이언트로 전송된 명령을 실제로 실행 데몬은 다른 데몬과 통신하여 Docker 서비스를 관리할 수도 있음
docker client
많은 Docker 사용자가 Docker와 상호 작용하는 기본 방법 docker run클라이언트는 이러한 명령을 로 전송하여 dockerd수행 docker명령은 Docker API를 사용 Docker 클라이언트는 둘 이상의 데몬과 통신할 수 있음
docker desktop
Mac, Windows 또는 Linux 환경을 위한 설치하기 쉬운 애플리케이션 컨테이너화된 애플리케이션 및 마이크로서비스를 구축하고 공유할 수 있음 Docker 데몬( dockerd), Docker 클라이언트( docker), Docker Compose, Docker Content Trust, Kubernetes 및 Credential Helper가 포함
docker registry
Docker 이미지를 저장할 수 있는 원격 저장소 Docker Hub는 누구나 사용할 수 있는 공개 레지스트리 Docker는 기본적으로 Docker Hub에서 이미지를 찾도록 구성되어 있음
docker images
사용자가 실행할 코드가 들어 있는 바이너리 한번 생성하면 수정 불가
docker container
컨테이너는 이미지의 실행 가능한 인스턴스 Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있음 컨테이너를 하나 이상의 네트워크에 연결하거나 스토리지를 연결하거나 현재 상태를 기반으로 새 이미지를 생성할 수도 있습니다. 컨테이너는 생성하거나 시작할 때 제공하는 구성 옵션과 이미지로 정의 컨테이너가 제거되면 영구 저장소에 저장되지 않은 상태 변경 사항이 모두 사라짐
docker file
Docker 이미지를 생성하기 위해 필요한 문서 어떻게 이미지를 만들고 실행할지 정의
docker engine
Docker가 실행되는 계층 컨테이너, 이미지, 빌드 등을 관리하는 경량 런타임 및 도구 Linux 시스템에서 기본적으로 실행
 
 

 

다음 방법으로 인코딩오류 해결

docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock uifd/ui-for-docker

9000번에서 돌아가는애를 9000번에서 실행, root계정에서 실행, -v == volume

 

도커 interface

 

도커 만들어진 컨테이너 시각화

 

 

  1. docker 설치

$sudo apt install -y docker.io

$sudo docker -v

  1. 사용자를 docker 그룹에 포함
    • sudo 명령어 없이 docker 활용 가능

$vi /etc/group

  • 그룹명 : 비밀번호 : 그룹id:보조그룹사용자
    • 예시 : docker:x:118:ubuntu
  • 사용자가 docker 그룹에 포함된 사항 확인
    • $tail /etc/group

 

tomcat 실습

$docker run --name mytomcat -p 80:8080 tomcat:9.0 
$docker run --name mytomcat -d -p 80:8080 tomcat:9.0

# image 확인
$docker images

# container 실행확인
$docker ps

# 실행 확인을 위한 curl 접속
$curl http://localhost
$curl http://localhost:80

# tomcat container로 유입
$docker ps    # tomcat 컨테이너 id 확인
$docker exec -it <container_id> bash

# 주석: tomcat 컨테이너의 bash 명령어 창 진입
#pwd
#who  블랭크인 경우 root로 간주
#cd /
#cat /etc/os-release   운영체제 버전
#java -version   tomcat 설치 시스템에는 반드시 jdk 설치가 우선
#printenv   현 운영체제의 path 확인 jdk와 tomcat 자체의 환경 확인

 

컨테이너 실행확인 개수확인

$docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS         PORTS     NAMES
c99282b585ae   nginx     "/docker-entrypoint.…"   21 hours ago   Up 4 seconds   80/tcp    elegant_lalande


$docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED        STATUS                    PORTS     NAMES
c99282b585ae   nginx             "/docker-entrypoint.…"   21 hours ago   Up 14 seconds             80/tcp    elegant_lalande
d9b37ddb3d21   nginx:latest      "/docker-entrypoint.…"   21 hours ago   Exited (0) 21 hours ago             competent_proskuriakova
c4008a0d5ede   nginx:latest      "/docker-entrypoint.…"   22 hours ago   Exited (0) 22 hours ago             eager_margulis
6e4d9e771840   nginx             "/docker-entrypoint.…"   22 hours ago   Exited (0) 22 hours ago             epic_snyder
07acadfd6c64   docker/whalesay   "echo hi"                22 hours ago   Exited (0) 22 hours ago             infallible_almeida
67b63f4fcc69   docker/whalesay   "hi"                     22 hours ago   Created                             elated_bohr
51129d334fe5   docker/whalesay   "/bin/bash"              22 hours ago   Exited (0) 22 hours ago             friendly_stonebraker

 

  • 네트워크, 볼륨 등 컨테이너에 대한 모든 정보 확인
    • container의 id 확인 후에 실행
    • $docker ps
    • $docker inspect <container_id>

 

 

nginx server란? 오픈 소스 웹 서버 Nginx는 정적 또는 동적 웹 사이트, 리버스 프록시, 로드 밸런싱 및 기타 HTTP 및 프록시 서버 기능을 제공하는 데 사용

nginx

 

# 호스트의 80 포트를 컨테이너의 80 포트와 매핑
$docker run --name nginxwebserver -d -p 80:80 nginx

# 실행중인 컨테이너 list 검색
$docker ps

 

  • -name webserver : webserver 이름으로 실행
  • -d : 백그라운드 옵션(detach)
  • -p 옵션
    • Network 설정, 외부의 트래픽을 컨테이너 내부로 전달하기 위해 로컬 호스트 서버와 컨테이너를 매핑하는 트래픽 포워딩 설정
    • 80:80 : 호스트의 80 포트와 컨테이너 80 포트를 연결!
# container id확인 후 index.html file 검색
$docker ps -a
$docker exec <container_id> sh -c 'ls /usr/share/nginx/html'
index.html

# index.html 표현 생략 가능
$curl localhost/index.html
  1. 명령어 전달 syntax

 📌

  1. 기본 명령어 docker exec <container_id> <cmd>
  2. cmd 명령어 옵션 docker exec <container_id> sh -c ‘명령어’

sh -c : shell 명령어 적용을 위한 옵션

3. 설치된 nginx server 내부에 내장된 html 파일 list 확인

# 컨테이너 id 확인
$docker ps

# 컨테이너 내부의 nginx 서버내부의 파일 확인
$docker exec 5d22d12b0c93 sh -c 'ls /usr/share/nginx/html'

index.html

 

  1. index.html 파일 내용 보기
  • /usr/share/nginx/html 은 서버의 nginx server의 웹서빙 디렉터리
  •  
# 새로운 패키지 설치 
$docker exec 5d22d12b0c93 sh -c 'cat /usr/share/nginx/html/index.html'

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

 

  1. 호스트에서 컨테이너로 파일 복사하기
  • 작업 단계
    • host : txt 파일 생성
    • container의 nginx server의 html 폴더에 파일 복사하여 붙여 넣기
    • 붙여넣기 한 파일 내용 확인 하기
    • 만일 로컬 원본 파일 수정시에 container 파일을 영향 받지 않음
# 파일 생성
$ls
hostmakefile.txt  index.html


# 컨테이너 id 확인
$docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED       STATUS       PORTS                                                           NAMES
5d22d12b0c93   nginx     "/docker-entrypoint.…"   6 hours ago   Up 6 hours   0.0.0.0:80->80/tcp, :::80->80/tcp   docker-nginx


# host에서 컨테이너로 복사 붙여넣기
# hostmakefile.txt는 로컬 / <container_id>:<container디렉터리경로>
$docker cp hostmakefile.txt 5d22d12b0c93:/usr/share/nginx/html


# container 내부의 파일 목차 확인하기
$docker exec 5d22d12b0c93 sh -c 'ls /usr/share/nginx/html'
hostmakefile.txt
index.html


# 파일 내용 확인하기
$docker exec 5d22d12b0c93 sh -c 'cat /usr/share/nginx/html/ho*'
host에서 만든 파일

 

5. 이미지로 컨테이너 생성 및 컨테이너 내부 바로 접속 리뷰하기

  • 이미지 다운로드 & 설치 & 내부 자동 유입
  1. 명령어 기본 syntax-it : interactive 옵션, stdin, stdout 연결, tty(터미널 연결)의 약자**
  2.  docker run -it <이미지명>
    • 도커 저장소로 부터 nginx 서버 이미지를 다운로드 및 설치, 컨테이너 내부로 자동 유입
    • 컨테이너 내부의 html 파일 검색
    • 컨테이너 빠져나오기
    • 컨테이너 재 실행
    • 컨테이너 내부로 재진입
    • 실행중인 nginx server에 접속해 보기실습
      🖌️ 실습 단계
docker run -it nginx bash
ls /usr/share/nginx/html
exit
docker run -d nginx
docker exec -it <container_id> bash

 

 

# 컨테이너와 이미지가 확인
$docker container ls
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

$docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

# nginx 이미지 다운로드 및 설치 
$docker run -it nginx bash
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
5b5fe70539cd: Pull complete
441a1b465367: Pull complete
3b9543f2b500: Pull complete
ca89ed5461a9: Pull complete
b0e1283145af: Pull complete
4b98867cde79: Pull complete
4a85ce26214d: Pull complete
Digest: sha256:593dac25b7733ffb7afe1a72649a43e574778bf025ad60514ef40f6b5d606247
Status: Downloaded newer image for nginx:latest

# nginx container 내부로 자동 유입
root@8ef7610d74d3:/# pwd
/

root@8ef7610d74d3:/# ls
bin   docker-entrypoint.d   home   lib64   mnt   root  srv  usr
boot  docker-entrypoint.sh  lib    libx32  opt   run   sys  var
dev   etc                   lib32  media   proc  sbin  tmp

# nginx server의 html 파일 위치 검색
root@8ef7610d74d3:/# ls /usr/share/nginx/html
50x.html  index.html

# 컨테이너 빠져 나오기
root@8ef7610d74d3:/# exit
exit

# 컨테이너 빠져 나온 후 명령창
$
$docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                     PORTS     NAMES
8ef7610d74d3   nginx     "/docker-entrypoint.…"   28 minutes ago   Exited (0) 3 minutes ago             ecstatic_torvalds

# 컨테이너 실행
$docker run -d nginx
a58cfa972a7fa2b1a30c6085853452e9e4c79660b417d2521e58352937e6a694

$docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
a58cfa972a7f   nginx     "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   80/tcp    upbeat_dubinsky

# exec 명령어로 bash 접속
$docker exec -it a58cfa972a7f bash
root@a58cfa972a7f:/#

컨테이너 중단, 재개, 삭제

직접 실습

 

??

해당 오류는 docker ps -a 로 실행중인 환경을 확인 후 docker rm -f <>를 통해 해결할 수 있다

ITStudy / 07_docker 폴더 안에 index.html 생성, a.txt도 괜찮아요 

docker run --name nginxwebserver -d -p 80:80 nginx

 

 

docker cp index.html nginxwebserver:/usr/share/nginx/html

client : container

환경이 된다.

 

01. Docker Container 생성, 실행, 정지, 삭제 단계

1-1. 컨테이너 로그 확인

 📌 참고 : 컨테이너에서 출력되는 **로그 기록 확인 명령어

$docker logs <container_id> $docker logs -f <container_id>

-f option : follow output, 백그라운드로 실행된 컨테이너의 로그 확인

종료 : <CTRL>+<C>

 

Docker CLI
커맨드                                            의미
 
docker build
Dockerfile로 이미지 빌드
docker images
이미지 리스트 보기
docker image inspect
이미지 상세 정보 보기
docker pull
레지스트리로부터 이미지 가지고 오기
docker push
레지스트리에 이미지 전송하기
docker history
이미지 생성 기록 보기
docker rmi
이미지 삭제
docker import
Docker container export로 가지고 온 것으로 이미지 만들기
docker save
이미지 tar 아카이브로 출력
docker load
Docker image save로 출력한 것(tar 아카이브)으로 이미지 로드
docker tag
기존의 이미지에 태그 붙이기
docker ps
컨테이너 목록 보기
docker logs
컨테이너 로그 취득
docker exec
실행 중인 컨테이너 내부에서 커맨드 실행
docker container inspect
컨테이너의 자세한 정보 보기
docker port
컨테이너 포트 맵핑 보기
docker rm
컨테이너 삭제
docker run
새로운 컨테이너로 커맨드 실행
docker start
정지 중인 컨테이너 기동
docker stop
실행 중인 컨테이너 중지
docker restart
컨테이너 다시 시작
docker kill
실행 중인 컨테이너(Docker가 만든 PID 1 프로세스)에 신호 보내기

명령어

$docker ps -a
$docker image ls
$docker pull nginx
$docker ps
$docker image ls
$docker run --name docker-nginx -p 80:80 nginx
$docker ps -a
$docker exec <containerid> sh -c 'curl localhost'
$docker stop <container_id>
$docker start<container_id>
$docker ps -a
$docker container ls
$docker rm <container_id>
$docker container ls
$docker image ls
$docker image rm <imagee_id> or docker rmi <image명>
$docker image ls

절대경로, 상대경로로 보면 편함

 

Container 생성 명령어

docker run --name <생성하는컨테이너_이름>  -d  -p  <포트포워딩>  -v  <호스트경로>:<컨테이너경로>  <이미지명>

 

 

docker run --name mynginxserver1 -d -p 81:80 -v /root/test:/usr/share/nginx/html nginx
docker run --name mynginxserver2 -d -p 82:80 -v C:\ITStudy\07_docker:/usr/share/nginx/html nginx

 

 

 

  • 마운트란?
    • 연결’
    • 컨테이너는 ‘쓰고 버리는’’ 개념이며, 소프트웨어 업그레이드 등을 이유로 언젠가는 삭제됨. 그런데 데이터도 컨테이너 안에 들어있다면?
      • Data Persistency
    • 그래서 저장해야 하는 데이터는 컨테이너 외부에 있는 별도의 장소에 피신시킴
    • 이를 컨테이너 외부에 있는 데이터 스토리지(저장소)에 ‘마운트’한다고 부름

삭제를 해도 경로만 잘 지정된다면 그대로 사용 가능

 

  • 볼륨마운트: 도커 엔진이 관리하는 영역 내에 만들어진 볼륨을 컨테이너에 디스크 형태로 마운트
  • 바인드마운트: 도커가 관리하지 않는 영역의 기존 디렉토리를 컨테이너에 마운트
  • 임시메모리(tmpfs)마운트: 디스크가 아닌 주 메모리 영역 마운트. 속도는 빠르지만 도커 엔진이 정지되거나 호스트가 재부팅되면 소멸

 

다시한번 명령어를 정확히 확인

 

# 리눅스 환경
docker run --name mynginxserver1 -d -p 81:80 -v /root/test:/usr/share/nginx/html nginx

# 윈도우 환경 -> 경로 구분자 
docker run --name mynginxserver2 -d -p 82:80 -v C:\ITStudy\07_docker:/usr/share/nginx/html nginx

 

# 볼륨 생성
docker volume create 볼륨명

# 경로 확인
docker volume inspect 볼륨명 

# 볼륨 삭제
docker volume rm 볼륨명

# 바인드마운트
docker run -v 스토리지실제경로:컨테이너마운트경로

# 볼륨마운트
docker run -v 볼륨명:컨테이너마운트경로
docker run -it -p 83:80 -v 볼륨명:/usr/share/nginx/html nginx


\\wsl.localhost\docker-desktop-data\data\docker\volumes\test\_data

컨테이너를 아무리 삭제를 해도 voulmes에 있는 파일이 자동으로 반영

 

안쓰는 volumes 삭제

 

 

 

다시

# 이미지 다운로드
$docker pull nginx
$docker images

# yeonjinginxserver 이름의 컨테이너 생성
$docker run --name jeongwooserver -d -p 80:80 nginx

# index.html 파일 수정 후 확인, 새로운 이미지 구성을 위한 변화 적용
$docker cp quka.png jeongwooserver:/usr/share/nginx/html
$docker cp index.html jeongwooserver:/usr/share/nginx/html

 

컨테이너에서 이미지로 만듦

 

PS C:\ITStudy\07_docker> docker tag jeongwooimage atangi/jeongwooimage:1
PS C:\ITStudy\07_docker> docker images

Dockerfile이란?

 

01. 이미지화의 필요성

  • 이미지란?
    • 컨테이너를 실행하기 위해 필요한 빌드된 패키지
  • 코드의 형식으로 인프라를 구성하여, Docker 이미지 파일을 생성할 수 있는 텍스트 파일
  • docker build를 사용하여 이미지 구성 가능
  • Dockerfile 구성
    • 사용할 이미지나 실행할 특정 명령어들로 구성
    • 특정 명령어란?
      • Dockerfile에 기반 이미지를 지정
      • 원하는 SW 및 library를 설치하기 위한 명령들 기술
      • 컨테이너 실행 시 수행할 명령을 기술

# 이미지 다운로드
$docker pull nginx
$docker images

# yeonjinginxserver 이름의 컨테이너 생성
$docker run --name yeonjinginxserver -d -p 80:80 nginx

# index.html 파일 수정 후 확인, 새로운 이미지 구성을 위한 변화 적용
$curl localhost/index.html
$docker exec -it -e LC_ALL=C.UTF-8 a5f2e5a262ff bash


# commit 명령어로 이미지 구성
# 생성된 컨테이너를 yeonjiserver 이름의 이미지로 생성
$docker commit yeonjinginxserver yeonjiserver


# 이미지 확인
$docker images
REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
yeonjiserver   latest    736f50693e4b   46 minutes ago   248MB
nginx             latest    eb4a57159180   12 days ago      187MB

# Tag 적용(version 권장)
$docker tag yeonjiserver <DockerHubUserName>/yeonjiserver:1

# Tag가 적용된 이미지 확인
$docker images
REPOSITORY                          TAG       IMAGE ID       CREATED          SIZE
<DockerHubUserName>/yeonjiserver   1       736f50693e4b   48 minutes ago   248MB
yeonjiserver                     latest    736f50693e4b   48 minutes ago   248MB
nginx                               latest    eb4a57159180   12 days ago      187MB

# Docker hub에 이미지 업로드
$docker push <DockerHubUserName>/jeongwooserver:1
The push refers to repository [docker.io/<DockerHubUserName>/yeonjiserver]
fca5a08f52c5: Pushed
9e96226c58e7: Mounted from library/nginx
12a568acc014: Mounted from library/nginx
7757099e19d2: Mounted from library/nginx
bf8b62fb2f13: Mounted from library/nginx
4ca29ffc4a01: Mounted from library/nginx
a83110139647: Mounted from library/nginx
ac4d164fef90: Mounted from library/nginx
1: digest: sha256:9d6aef6a86f946705ef9da89ddb90681920a77947a2c58a09d35af3940c8f792 size: 1990

 

 

# Dockerfile
FROM nginx:latest
RUN  echo '<h1> test nginx web page </h1>'  >> index.html
RUN cp /index.html /usr/share/nginx/html

 

 

 

docker file

 

  • 코드의 형식으로 인프라를 구성하여, Docker 이미지 파일을 생성할 수 있는 텍스트 파일
  • docker build를 사용하여 이미지 구성 가능
  • Dockerfile 구성
    • 사용할 이미지나 실행할 특정 명령어들로 구성
    • 특정 명령어란?
      • Dockerfile에 기반 이미지를 지정
      • 원하는 SW 및 library를 설치하기 위한 명령들 기술
      • 컨테이너 실행 시 수행할 명령을 기술

참고: Java file을 활용한 이미지 & 컨테이너 생성 및 실행

$ls
Dockerfile  Main.java


$cat Dockerfile
FROM openjdk:17
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD ["java", "Main"]


$cat Main.java
public class Main{
        public static void main(String [] args){
                System.out.println("안녕 ~");
        }
}


# -t tag 옵션 적용하면서 이미지 생성
# 이미지를 docker hub에 업로드 하기
$docker build -t atangi/myjavarun:1.0 .
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM openjdk:11
 ---> 47a932d998b7
Step 2/5 : COPY . /usr/src/myapp
 ---> Using cache
 ---> d3ec51e845cc
Step 3/5 : WORKDIR /usr/src/myapp
 ---> Using cache
 ---> f45fb3e3799b
Step 4/5 : RUN javac Main.java
 ---> Using cache
 ---> 483eb9ec5a8e
Step 5/5 : CMD ["java", "Main"]
 ---> Using cache
 ---> 708c7b95d674
Successfully built 708c7b95d674
Successfully tagged atangi/myjavarun:1.0

$docker images
REPOSITORY              TAG       IMAGE ID       CREATED              SIZE
atangi/myjavarun   1.0       708c7b95d674   About a minute ago   654MB

$docker push atangi/myjavarun:1.0
The push refers to repository [docker.io/atangi/myjavarun]
e71916ebca41: Pushed
4a73e503b326: Pushed
7b7f3078e1db: Mounted from library/openjdk
826c3ddbb29c: Mounted from library/openjdk
b626401ef603: Mounted from library/openjdk
9b55156abf26: Mounted from library/openjdk
293d5db30c9f: Mounted from library/openjdk
03127cdb479b: Mounted from library/openjdk
9c742cd6c7a5: Mounted from library/openjdk
1.0: digest: sha256:99800760120bb6316b17cc8869d3dc34fba1900649b7375afde769af94a7b9d7 size: 2209


# 실행
$docker run atangi/myjavarun:1.0
안녕 ~

# 만일 : 이미지 삭제시 에러 메세지 발생시의 해결책 -f 옵션 추가
$docker rmi atangi/myjavarun:1.0
Error response from daemon: conflict: unable to remove repository reference "myjavarun:1.0" (must force) - container baf46a0d4975 is using its referenced image 066f960250fb


$docker rmi -f atangi/myjavarun:1.0
Untagged: myjavarun:1.0
Deleted: sha256:066f960250fbd75bdde3640dbd54db5a683fc24a59e30ae7fd272ba816ccbbf3
Deleted: sha256:8f8d703514f16f5c3d607460df6f39b61d4e852d8f459dfed32462bfeeb1b7ed
Deleted: sha256:5eceb0abd424f282aff0558e4b4eb18c7e86992035b7ce9149bcfd027cf21b84
Deleted: sha256:08f41810b8ac4fef0ac8c1d971a02d434bb692ca50938f5594df9a5def41e9b0

 

 

Main.java

public class Main{
        public static void main(String [] args){
                System.out.println("안녕 ~");
        }
}

 

Dockerfile

# Dockerfile
FROM openjdk:17
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
RUN javac Main.java
CMD ["java", "Main"] # 리눅스 대문자소문자 가림

 

 

 

 

이제 다시 삭제

docker ps -a 후 실행되고있는 이미지 앞자리 3글자 확인

docker run --name mysql_test -dit -e MYSQL_ROOT_PASSWORD=0000 mysql
# 'network create' 커맨드로 네트워크 생성하기
docker network create wordpress000net1

# 'run' 커맨드로 MySQL 컨테이너를 생성 및 실행하기
docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

# 'run' 커맨드로 WordPress 컨테이너를 생성 및 실행하기
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress

# 'ps' 커맨드로 컨테이너가 실행 중인지 확인하기
docker ps

# 뒷정리하기
docker stop wordpress000ex12
docker stop mysql000ex11
docker rm wordpress000ex12
docker rm mysql000ex11
docker network rm wordpress000net1

docker network ls

 

 

워드프레스 내부 통신 가능

가상의 네트워크로 db를 연결하는 과정

 

 

docker-compose

yaml파일

version: "1"

services:
  mysql000ex11:
    image: mysql:8
    networks:
      - wordpress000net1
    volumes:
      - mysql000vol11:/var/lib/mysql
    restart: always
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: myrootpass
      MYSQL_DATABASE: wordpress000db
      MYSQL_USER: wordpress000kun
      MYSQL_PASSWORD: wkunpass

  wordpress000ex12:
    depends_on:
      - mysql000ex11
    image: wordpress
    networks:
      - wordpress000net1
    volumes:
      - wordpress000vol12:/var/www/html
    ports:
      - 8085:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: mysql000ex11
      WORDPRESS_DB_NAME: wordpress000db
      WORDPRESS_DB_USER: wordpress000kun
      WORDPRESS_DB_PASSWORD: wkunpass
networks:
  wordpress000net1:
volumes:
  mysql000vol11:
  wordpress000vol12:

여러개의 컨테이너를 묶어서 동작할 수 있다

 

mysql 컨테이너 생성

docker run --name mysql_test -dit -e MYSQL_ROOT_PASSWORD=0000 mysql

 

이미지 삭제

$ docker image rm 이미지이름 ...

 

# 'network create' 커맨드로 네트워크 생성하기
docker network create wordpress000net1

# 'run' 커맨드로 MySQL 컨테이너를 생성 및 실행하기
docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

# 'run' 커맨드로 WordPress 컨테이너를 생성 및 실행하기
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress

# 'ps' 커맨드로 컨테이너가 실행 중인지 확인하기
docker ps

# 뒷정리하기
docker stop wordpress000ex12
docker stop mysql000ex11
docker rm wordpress000ex12
docker rm mysql000ex11
docker network rm wordpress000net1

docker network ls

 

🐋02. Docker Container 네트워크 기본 명령어

1. 컨테이너간 통신을 위한 설정

가상네트워크 설정

# docker network list 확인
$docker network ls

# 생성
$docker network create 네트워크명

# 삭제
$docker network rm 네트워크명

# 네트워크 상세 정보 확인
$docker inspect 네트워크명

 

# 생성
$docker network create sql-network
84dee7ab3bb6c06a825fea7f3582dde1d8b8592a872a2a6ad65c2f6fcccd870d


# 네트워크 리스트 확인
$docker network ls
NETWORK ID     NAME                   DRIVER    SCOPE
84dee7ab3bb6   sql-flask-network   bridge    local

# 삭제
$docker network rm sql-network
sql-network

# 상세 내역 확인
$docker inspect sql-network

 

🐋03. Docker Compose

  • 시스템 구축과 관련된 명령어를 하나의 YAML 파일에 기재해 명령어 하나로 시스템 전체를 실행, 종료, 관리할 수 있게 도와주는 도구

Docker Compose는 여러 개의 Docker 컨테이너를 정의하고 실행하기 위한 도구입니다. Docker Compose를 사용하면 YAML 파일을 사용하여 여러 컨테이너를 정의하고, 실행, 중지, 제거 및 로그 등을 관리할 수 있습니다.

 

Docker Compose를 사용하여 애플리케이션을 실행하려면 다음 단계를 수행하면 됩니다:

  1. Dockerfile 작성: 각 서비스의 Docker 이미지를 작성하기 위해 Dockerfile을 작성합니다.
  2. docker-compose.yml 파일 작성: 각 서비스에 대한 설정을 정의하는 YAML 파일을 작성합니다.
  3. 애플리케이션 실행: docker-compose up 명령을 사용하여 애플리케이션을 실행합니다.
version: "1"
services:
  mysql000ex11:
    image: mysql:8
    networks:
      - wordpress000net1
    volumes:
      - mysql000vol11:/var/lib/mysql
    restart: always
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: myrootpass
      MYSQL_DATABASE: wordpress000db
      MYSQL_USER: wordpress000kun
      MYSQL_PASSWORD: wkunpass

  wordpress000ex12:
    depends_on:
      - mysql000ex11
    image: wordpress
    networks:
      - wordpress000net1
    volumes:
      - wordpress000vol12:/var/www/html
    ports:
      - 85:80
    restart: always
    environment:
      WORDPRESS_DB_HOST: mysql000ex11
      WORDPRESS_DB_NAME: wordpress000db
      WORDPRESS_DB_USER: wordpress000kun
      WORDPRESS_DB_PASSWORD: wkunpass
networks:
  wordpress000net1:
volumes:
  mysql000vol11:
  wordpress000vol12:
  • docker-compose up 명령을 사용하면 YAML 파일에 작성한 명령어에 따라 서비스가 동시에 실행됩니다.
  • docker-compose build: Docker 이미지를 빌드합니다.
  • docker-compose start: 중지된 서비스를 시작합니다.
  • docker-compose stop: 실행 중인 서비스를 중지합니다.
  • docker-compose down: 서비스를 중지하고 관련된 Docker 컨테이너와 네트워크, 볼륨 등을 제거합니다.
  • docker-compose logs: 로그를 출력합니다.

3. Docker Compose 주요 기본 명령어

  1. up command
    1. docker run 과 흡사
    2. 정의 파일(yml)에 기재된 내용대로 이미지를 내려받고 컨테이너 생성 및 실행
    3. 정의 파일 - 네트워크나 볼륨에 대한 정의도 기재할 수 있어서 주변 환경을 한꺼번에 생성 할 수 있음
  2. down command
    1. 컨테이너와 네트워크를 정지 및 삭제
    2. 볼륨과 이미지는 삭제하지 않음
  3. stop
    1. 컨테이너와 네트워크 삭제 없이 종료만

 

yml파일 작성 형식

 

mysql db컨테이너 생성

1.  정의  파일 :  docker-compose.yml

version: "3"

services:
  mydb:
    image: mysql:latest
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=fisa
    ports:
      - "3306:3306"

2. 실행 명령어 : mysql 컨테이너 생성

$docker-compose up -d

[+] Running 12/12
 ⠿ mydb Pulled                                                                                  
   ⠿ 49bb46380f8c Pull complete                                                                         
   ⠿ aab3066bbf8f Pull complete                                                                       
   ⠿ d6eef8c26cf9 Pull complete                                                                           
   ...                                                                     
[+] Running 2/2
 ⠿ Network composetest_default   Created                                                                  
 ⠿ Container composetest-mydb-1  Started

 

3. mysql 컨테이너 확인

$docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
9fbf39c83fbc   mysql:latest   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   composetest-mydb-1


$ docker exec -it composetest-mydb-1 bash

bash-4.4# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.33 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| fisa               |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use fisa;
Database changed
mysql> show tables;
Empty set (0.00 sec)

 

 

spring 연동

 

메이븐의 생명주기 대로 가져옴

maven clean 후 run as를 통해 package 라고 Goals에 입력

 

 

 

aws 생성하기

 

AWS로 이어서 진행하겠습니다.

'Tech Stack > docker' 카테고리의 다른 글

docker 1  (0) 2024.02.02