Vitualization
- 가상화 - 하나의 물리적인 머신에서 여러개의 운영체제를 실행
클라우드 컴퓨팅에서의 가상화
- 운영체제내에 가상머신을 생성하는 하드웨어 가상화
리소스를 줄이거나 늘리거나 하는 작업도 가능
가상화의 장점
- 유연성
- 민첩성
- 내결함성
- 비용절감
하드웨어 위에다가 어플리케이션에서 확장하여
- 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
도커 만들어진 컨테이너 시각화
- docker 설치
$sudo apt install -y docker.io
$sudo docker -v
- 사용자를 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
- 명령어 전달 syntax
📌
- 기본 명령어 docker exec <container_id> <cmd>
- 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
- 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>
- 호스트에서 컨테이너로 파일 복사하기
- 작업 단계
- 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. 이미지로 컨테이너 생성 및 컨테이너 내부 바로 접속 리뷰하기
- 이미지 다운로드 & 설치 & 내부 자동 유입
- 명령어 기본 syntax-it : interactive 옵션, stdin, stdout 연결, tty(터미널 연결)의 약자**
- 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를 사용하여 애플리케이션을 실행하려면 다음 단계를 수행하면 됩니다:
- Dockerfile 작성: 각 서비스의 Docker 이미지를 작성하기 위해 Dockerfile을 작성합니다.
- docker-compose.yml 파일 작성: 각 서비스에 대한 설정을 정의하는 YAML 파일을 작성합니다.
- 애플리케이션 실행: 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 주요 기본 명령어
- up command
- docker run 과 흡사
- 정의 파일(yml)에 기재된 내용대로 이미지를 내려받고 컨테이너 생성 및 실행
- 정의 파일 - 네트워크나 볼륨에 대한 정의도 기재할 수 있어서 주변 환경을 한꺼번에 생성 할 수 있음
- down command
- 컨테이너와 네트워크를 정지 및 삭제
- 볼륨과 이미지는 삭제하지 않음
- stop
- 컨테이너와 네트워크 삭제 없이 종료만
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 |
---|