도커

최창효·2022년 9월 12일
0
post-thumbnail

Docker

도커 설치

도커에 대해

(이해를 위해 최대한 간단하게 작성하려 했고 그 과정에서 생략되거나 왜곡된 내용이 존재할 수 있습니다. 또한 제가 이해한 내용이 틀렸을 수도 있다는 점 유의해 주세요!!)

도커란

  • 컨테이너 기반의 가상화 플랫폼
  • 자바를 공부할 때 자바파일이 JVM덕분에 OS 독립적인 환경을 구축할 수 있었던 것처럼 (https://velog.io/@qwerty1434/Java-Virtual-Machine), 도커 컨테이너 역시 어떤 OS든지 Docker가 설치되어 있다면 실행이 가능한거 같음
  • 도커를 사용하는 이유: VM보다 가볍게 독립적인 환경을 구성할 수 있기 때문에
내가 이해한 도커: VM보다 가벼운 가상환경

컨테이너란

  • 하나의 독립적인 공간
  • 컨테이너는 이미지로부터 만들어 짐

이미지란

  • 컨테이너의 모든 설정값을 저장해둔 파일
내가 이해한 컨테이너와 이미지
	- 이미지: 바탕화면에 있는 바로가기 아이콘 또는 프로그램 실행 버튼 
	- 컨테이너: 아이콘으로부터 실행된 실제 프로그램 
	- 이미지A를 불러와 컨테이너 A를 실행시키고, 컨테이너 A에서 x작업을 실행한 뒤 
      이 컨테이너를 다시 이미지화 해 이미지B를 생산할 수 있다.(레이어가 쌓이게 됨)

도커 실습

들어가기 앞서

  • 자주 사용하는 명령어

docker ps 실행중인 컨테이너 확인

docker ps -a 모든 컨테이너 확인

docker images 모든 이미지 정보 확인

docker run -d -it --name <컨테이너 이름> -p 로컬PC포트:도커_포트 이미지_이름:태그 컨테이너 생성

docker stop <컨테이너 이름> 컨테이너 멈추기

docker start <컨테이너 이름> 컨테이너 실행하기

docker exec -it <컨테이너_이름> /bin/bash 컨테이너 들어가기

service mysql start mysql 실행

curl ident.me내 ip주소 확인

실습 목표

1. 내 PC에서 이미지를 만듦
2. 해당 이미지를 도커hub에 올림
3. 서버 PC에 접속해 도커hub로부터 이미지를 받아와 실행함

A. 도커 설치

  • 생략

B. 내 PC(윈도우)에서

  • 우리의 최종 컨테이너가 우분투 환경이길 희망하기 때문에 docker pull ubuntu:18.04명령어로 우분투 기본 이미지를 받아옵니다.
  • docker run -d -it -p 8080:8080 —-name <컨테이너 이름> ubuntu:18.04명령어를 실행해 ubuntu:18.04이미지를 바탕으로 <컨테이너 이름> 이라는 컨테이너를 생성합니다.
  • docker ps명령어를 통해 우리가 만든 컨테이너가 실행중임을 확인할 수 있습니다.
  • 우리가 만든 컨테이너 내부에 들어가기 위해 docker exec -it <컨테이너 이름> /bin/bash명령어를 입력합니다.
    • cmd창의 앞부분이 윈도우 버전(>)에서 우분투 버전(#)으로 변경된 걸 확인할 수 있습니다.

B-1. 컨테이너 속에서

  • 우리는 pull로 받아온 ubuntu:20.04이미지를 기반으로 컨테이너를 실행했기 때문에 해당 컨테이너는 우분투 환경입니다.
    • 모든 설치 및 명령어는 우분투를 기준으로 작성해 줘야 합니다.
  • 각종 권한부여 및 파일 설치
    • 가장 먼저apt-get update 명령어로 설치 가능한 리스트들을 최신화 해 줍니다.
    • apt-get install -y sudo: sudo
    • apt-get install -y vim: vi
    • apt-get install -y net-tools: netstat (필요 없을듯?)
    • apt-get install -y openjdk-8-jdk: java 설치
    • apt-get install -y gradle: gradle 설치
    • apt-get install -y git: git 설치
    • apt-get install -y nginx: nginx 설치 (필요 없을듯?)
    • apt-get install -y mysql-server: mysql 설치
      • 우분투가 18.04라면 mysql은 5버전이 설치됩니다. 우분투를 20.04로 선택해 mysql을 로컬과 같은 8버전으로 설치합시다.
  • mysql 계정 설정 및 Schema 생성
    • service mysql start명령어로 mysql을 실행합니다.
    • sudo /usr/bin/mysql -u root명령어로 mysql에 접속합니다.
      • cmd 앞부분이 mysql>로 변경됐다면 접속에 성공했다는 뜻입니다.
    • 루트 비밀번호를 설정하고 싶다면 ALTER USER 'root'@'localhost' IDENTIFIED BY '루트 비밀번호';를 입력합니다. // 따옴표(')도 모두 동일하게 입력해 줘야 합니다
    • 계정을 생성하고 싶다면 CREATE USER '계정아이디'@'localhost' IDENTIFIED BY '계정 비밀번호';를 입력합니다. 그리고 flush privileges를 입력합니다.
      • flush privileges;: user 테이블의 값이 변경될 때 실행해야 하는 쿼리입니다.
    • 유저에 대한 권한을 부여하고 싶다면 GRANT ALL PRIVILEGES ON <DB이름>.* to <계정 아이디>@localhost;을 입력합니다. 그리고 flush privileges를 입력합니다.
    • 스키마를 생성하고 싶다면 CREATE DATABASE <데이터베이스 이름>을 입력합니다.
    • 모든 작업이 끝났으면 exit명령어로 mysql에서 나갑니다.
  • 깃허브에 올린 BackEnd파일 다운받아 실행해보기
    • (해당 과정은 EC2 서버에서 실행할 명령어들을 미리 점검해보는 과정으로 EC2 서버에서도 동일하게 반복해 줄 예정입니다.)
    • git clone <깃주소>명령어로 자신의 서버 파일을 다운받아 옵니다.
    • 저는 특정 브랜치를 기준으로 다운을 받고 싶어 git clone -b <브랜치 이름> --single-branch <깃주소> 라고 명령어를 입력했습니다.
    • cd명령어와 ls명령어를 적절히 활용해 gradle파일이 위치하는 곳까지 이동합니다.
    • gradle --debug build명령어를 실행합니다.
      • 이때 Permission denied가 발생할 수 있습니다. git ls-tree HEAD로 권한을 확인해보면 gradle의 권한이 755가 아닌 644인걸 확인할 수 있습니다. chmod +x ./gradlew명령어를 통해 권한을 변경해 줍니다.
      • 수정) EC2 서버에는 ./gradlew build명령어가 성공했습니다.
        • gradlewgradle build의 차이는 윈도우와 리눅스로 알고 있습니다. 하지만 도커의 컨테이너는 EC2와 로컬PC에 무관하게 모두 Linux인데 왜 이런 차이가 발생할까요??
      • 수정2) 로컬 도커에서도 ./gradle build명령어가 성공햇습니다.
    • cd명령어와 ls명령어를 적절히 활용해 .jar파일이 있는 위치로 이동합니다.
    • java -jar 파일이름.jar명령어를 통해 서버를 실행합니다.
      • 파일이름에 SNAPSHOT이 붙는데 이건 왜그럴까?
      • 원격 서버에서 우리는 이거를 nohup으로 돌릴 계획입니다.
        • nohup으로 실행하기 위해 chmod 755 파일이름.jar명령어를 입력해 파일 권한을 변경해 줍니다.
  • 모든 설정이 끝났습니다. exit명령어로 컨테이너 밖으로 나옵니다.

C. 내 PC(윈도우)에서

  • docker commit -a "작성자" -m "커밋_메시지" 이미지화_할_컨테이너_이름 이미지_이름:태그명령어로 B과정에서 설정한 컨테이너를 이미지로 만들어 줍니다.
    • docker ps명령어 또는 docker ps -a명령어를 통해 컨테이너 이름을 확인할 수 있습니다.
    • docker images를 통해 해당 이미지_이름:태그가 잘 생성되었는지 확인합니다.
여기까지가 실습1단계(내 PC에서 이미지 만들기) 입니다.

계속해서 내 PC에서

  • [https://hub.docker.com/이라는](https://hub.docker.com/이라는) 도커허브에 접속합니다.
  • Create a Repository에서 Name 및 Description을 입력하고 Create를 누릅니다.
  • 로컬에 있는 이미지를 도커허브의 Repo에 올리기 위해서는 허브의 이름과 이미지의 이름이 동일해야 합니다
    • 허브에서 내 Repository의 이름이 qwerty1434/favshare라면 내가 만드는 이미지 역시 qwerty1434/favshare여야 합니다.
    • 따라서 이미지 생성 명령어는 docker commit -a "qwerty1434" -m "hub_test" favs2hare qwerty1434/favshare:0.0가 됩니다.
  • docker push qwerty1434/favshare:0.0명령어를 통해 이미지를 도커허브에 올립니다.
여기까지가 실습2단계(해당 이미지 도커hub에 올리기) 입니다.

D. EC2 서버(우분투)에서

  • EC2 서버 접속에 대한 부분은 여기를 읽어주시면 됩니다.
  • 서버에서 docker를 설치합니다. (생략)
    • docker -v명령어와 docker ps명령어를 통해 설치가 완료되었는지 확인합니다.
    • docker ps명령어 입력시 permission denied에러가 발생한다면 sudo chmod 666 /var/run/docker.sock명령어를 입력합니다.
      • sudo명령어가 실행되지 않는다면 apt-get install -y sudo명령어를 입력해 sudo를 설치합니다.
  • docker pull명령어를 입력해 도커허브에 올린 이미지를 받아옵니다.
    • docker pull qwerty1434/favshare:0.0
  • 해당 이미지를 바탕으로 한 컨테이너를 만들어 줍니다.
    • docker run -d --cap-add=NET_ADMIN -it --name favs2hare -p 8080:8080 qwerty1434/favshare:0.0
  • 해당 컨테이너에 들어갑니다.
    • docker exec -it favs2hare /bin/bash
  • mysql을 실행합니다.
    • service mysql start
  • cd명령어와 ls명령어를 활용해 .jar파일이 위치한 곳으로 이동합니다.
  • nohup java -jar 파일이름.jar명령어를 통해 서버를 실행합니다.
여기까지가 실습3단계(서버에서 실행하기) 입니다.

추가

dump파일 옮기기

  1. dump파일 도커 안으로 넣기
    1. sudo docker cp final_data.sql backend:home
      1. 현재 위치의 final_data.sql이라는 파일을 backend컨테이너의 home위치에 넣겠다
  2. dump파일(.sql) 실행하기
    1. sudo mysql -u root -p favshare < final_data.sql
      1. root라는 아이디로 favshare스키마에 final_data.sql파일을 실행하겠다
profile
기록하고 정리하는 걸 좋아하는 개발자.

0개의 댓글