[Docker] 도커 사용 실습

Coastby·2022년 11월 6일
0

LIKELION Back-End School

목록 보기
52/61

Docker

  • 컨테이너 기술
  • 컨테이너란?
    • 리눅스 + 어플리케이션 : java 어플리케이션을 linux 서버에 띄우는 것

    • 빌드 → 리눅스에 바로 실행하면

      #root directory에서
      cd target
      java -jar hospital-api-0.0.1-SNAPSHOT.jar
      #작동되고 있는 지 확인하기
      [ec2주소]:8080/swagger-ui/
    • 포트번호는 디폴트로 8080인데, 이를 바꾸고 싶으면 java 실행 전에 아래 코드를 입력한다.

      export SERVER_PORT=[원하는포트]
  • 도커를 사용하면 1개 계층 (Hypervisor)가 없어도 되며, OS 위에서 바로 구동할 수 있다.
  • 대신, 리눅스만 가능하다. 하지만, 서버의 90%가 리눅스를 사용하고 있다.
  • Dockerfile 작성해서 메이븐 빌드까지도 할 수 있다. 원하는 작업을 스크립트화 해놓으면 어느 환경이든 구동할 수 있다.
    • Dockerfile은 프로젝트 루트 디렉토리에 있다.

    • 우리가 할 일은 우리가 개발한 어플리케이션을 컨테이너 형태로 만든느 것

    • Dockerfile 작성하기 + Environment Variable 로 변수 넘기기

    • ex) DB 접속 정보, API의 인증 정보 → 이미지에 들어올 수 있어서, 털릴 수 있다.

    • image도 git처럼 공유할 수 있는 사이트인 dockerhub가 있다. 원하는 docker를 다운/공유할 수 있다.

      #dockerhub에서 copy해서 사용
      docker pull gazgeek/springboot-helloworld
      docker run gazgeek/springboot-helloworld
  • OS에 dependency가 줄어든다.

Image

이미지는 여러 개의 계층으로 된 바이너리 파일로 존재하고, 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용된다. 이미지는 도커 명령어로 내려받을 수 있고 별도로 설치할 필요는 없다.

  • 파일 .jar → java가 깔려있는 linux에 .jar 파일이 들어있는 것 → docker image

Container

도커 이미지로 컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일이 들어 있는 파일 시스텀과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성되고, 이것이 도커 컨테이너가 된다.

도커 컨테이너는 생성될 때 사용된 도커 이미지의 종류에 따라 알맞은 설정과 파일을 가지고 있기 때문에 도커 이미지의 목적에 맞도록 사용되는 것이 일반적이다.

Docker 사용해보기

  • 도커 버전 확인
dockere -v

실습3] 컨테이너 안에서 명령어 전송해보기

  • -i, -t 옵션 : 컨테이너와 상호 입출력을 가능하게 한다.
  • ubuntu:22.04 : 컨테이너를 생성하기 위한 이미지 이름
docker run -i -t ubuntu:22.04
#환경변수 확인
printenv

실습4] 환경변수 넘기고 확인해보기

  • 어제 ubuntu 이미지로 -i, -t 옵션으로 들어가서 printenv 해보기
docker run -i -t -e SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306 ubuntu:22.04

  • 도커 컨테이너를 중지하며 나오고 싶은 경우 ctrl+D
  • 중지 없이 나오는 경우 ctrl+P+Q

실습5] 실행중인 컨테이너의 환경변수 알아보기

  • 실행중인 container의 environment variable 알아보기
    • 실행중인 컨테이너에서 ctrl + P + D로 나온다.
docker ps        #container_id를 확인한다.
docker exec [container_id] printenv 

🐳 docker exec

  • docker run은 컨테이너를 생성하고 실행할 때 사용하고, docker exec은 이미 실행된 컨테이너의 환경을 디버깅하는 용도로 사용한다.
  • 컨테이너에 접속, 컨테이너의 shell에 접근한다.
  • docker exec : 실행 중인 컨테이너에 대해서 명령어를 사용할 수 있다. command로 단순히 실행 결과를 출력하고 종료되는 명령어들이다.
docker exec <container_id> <command>
  • 인터렉티브한 환경에서 컨테이너 환경을 탐색하려면 -it 옵션을 사용한다.
    • -it : STDIN 표준 입출력을 열고 가상 tty (pseudo-TTY)를 통해 접속하겠다는 의미이다.
    • exit : 종료
docker exec -it <container_id> bash
  • 환경변수 순위 No Priority Property
    1 Low 기본 속성(SpringApplication.setDefaultProperties)
    2 @Configuration 클래스
    3 application.properties or application.yml 파일
    4 OS 환경 변수 —> -e로 넘어가면 OS환경변수로 등록됨
    5 자바 시스템 변수(System.getProperteis())
    6 JNDI attributes(java:comp/env)
    7 ServletContext 초기화를 위한 매개변수
    8 ServletConfig 초기화를 위한 매개변수
    9 SPRING_APPLICATION_JSON(환경 변수 또는 시스템 변수에 포함된 인라인 JSON)
    10 Command Line Arguments
    11 @SpringBootTest와 함께 사용된 properties
    12 @TestPropertySource
    13 High devtools 활성 상태일 때 $HOME/.config/spring-boot 디렉토리 내 devtools 전역 설정
  • mvn 빌드 → docker build : cost가 매우 큰 작업으로 human error가 매우 많이 발생한다.

실습6] 컨테이너 삭제

docker rm <container_id>

실행되는 컨테이너는 종료해야 한다.

docker kill <container_id>     # 도커 종료시키기
docker ps -a     # 내려간 컨테이너 확인하기

실습7] 이미지 지우기

docker rrmi <이미지이름>:<tag>

사용하던 컨테이너가 있으면, 컨테이너가 종료되었더라도 다시 쓸 수 있어서 못 징우게 한다. 그래서 종료된 컨테이너도 다 지우고 이미지를 지울 수 있다.

실습8] 워드프레스 띄우기

  • —name : name을 지정할 수 있다.
  • —link : 앞에서 —name을 지정해서 띄운 mysql과 연동할 수 있다.
docker run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql:5.7
docker run -d -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=password --name wordpress --link wordpressdb:mysql -p 80 wordpress

docker ps로 확인하면 호스트 포트의 49153과 도커 컨테이너의 80포트가 연결되었다. 그래서 호스트의 49153 포트를 열어주어야 한다.

아래 주소로 들어가면 워드프레스가 나온다.

[ec2주소]:49153

환경 설정하고, 띄우고 하는 것이 훨씬 빠르고 편리해졌다.

도커 볼륨

  • 도커가 내려가면 데이터가 사라진다는 문제가 있다.
  • 이를 방지하기 위해 컨테이너의 데이터를 영속적 데이터로 활용하는 방법 중 하나가 도커 볼륨이다.
    • 호스트와 볼륨을 공유
    • 볼륨 컨테이너 활용
    • 도커가 관리하는 볼륨을 생성할 수 있다.

호스트와 볼륨을 공유하기

볼륨마운트

docker run -d -v /root:/app ubuntu:22.04
docker ps            #container id 확인
docker exec <container_id> ls /app
  • -v <호스트의디렉토리>:<컨테이너의디렉토리> 두 디렉토리를 공유한다.
  • 파일 생성하면 같이 생성되는지 확인
#확인하는 법1
echo hello > hello.log
docker exec <container_id> ls /app
cat hello.log
#확인하는 법2
docker exec -it 252f9bf0660d bash     #-it 옵션을 이용해 컨테이너 셸을 실행할 수 있다.
cd app
ll

  • mysql 띄워서 볼륨마운트해보기
cd ~
mkdir mysql_data
docker run -d -p 3308:3306 --name wordpressdb2 -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -v /root/mysql_data:/var/lib/mysql mysql:5.7

호스트 디렉토리에서 새로운 테이블을 확인할 수 있다.

🚫 docker로 ubuntu를 실행하니 자동 종료된다.

 docker run -d 를 사용하여 entrypoint 또는 cmd 가 설정되어 있지 않은 이미지로 컨테이너 실행 시 위와 같이 컨테이너가 지속적으로 실행시킬 프로그램을 찾지 못하고 자동으로 종료된다.

자동으로 종료되지 않게 설정하기 위해서는 몇 가지 설정이 필요하다.

⭕️ bash command를 실행해서 바로 죽지 않았다

docker run -d -it -v /root:/app ubuntu:22.04

업로드중..

출처 : https://nasn.tistory.com/151

profile
훈이야 화이팅

0개의 댓글