본문 바로가기
Study/Cloud,Docker,Kubernetes

Docker(2)

by 왕방개 2024. 4. 3.

1.컨테이너 와 호스트 간의 파일 복사

1)복사 명령

docker cp 소스 타겟

=>현재 컴퓨터에 있는 파일을 컨테이너에 전달

docker cp 현재컴퓨터의 파일겨로 컨테이너:컨테이너 경로

=>컨테이너에 있는 파일을 현재 컴퓨터에 전달

docker cp 컨테이너:컨테이너 경로 현재 컴퓨터의 파일 경로

 

2)아파치 컨테이너 와 현재 컴퓨터 사이의 파일 복사

=>Apache:웹 서버이고 이미지 이름은 httpd 이며 내부에서 열려있는 포트는 80(http의 기본 포트)

웹 서버나 데이터베이스 서버처럼 게속해서 서비스를 해야 하는 컨테이너는 -d 옵션이로 실행해야 하고 터미널로 접속해야 하는 컨테이너는 -it 옵션을 추가해서 생성

포트포워딩할때는 -p호스트 컴퓨터의포트:컨테이너의포트

 

=>아파치 컨테이너 실행

docker run --name apa000ex19 -d -p 8089:80 httpd

 

=>접속

localhost:8089

=>아파치는 기본 디렉토리가 /usr/local/apache2/htdocs 인데 이 디렉토리의 index.html 를 로컬로 복사

docker cp apa000ex19:/usr/local/apache2/htdocs/index.html index.html

 

=>현재 컴퓨터의 파일을 컨테이너에 복사

docker cp index.html apa000ex19:/usr/local/apache2/htdocs/index.html

 

=>확인은 브라우저에서 localhost:8089로 접속을 해서 변경된 내용이 반영되었는지 확인

 

 

3)nginx 컨테이너 와 현재 컴퓨터 사이의 파일 복사

=>nginx:웹 서버이고 이미지 이름은 nginx 이며 내부에서 열려있는 포트는 80(http의 기본 포트)

nginx은 웹 서비스를 배포할 때 Load Balancer 역할이 가능

동일한 여러개의 웹 애플리케이션을 실행하고 nginx의 설정 파일에 아이피를 추가해두면 클라이언트는 nginx에 접속을 요청하고 nginx는 설정 파일에 있는 아이피에 순서대로 접속하도록 해줍니다.

public cloud는 Load Balancer서비스를 제공하기 때문에 nginx를 사용하지 않는 경우도 많습니다.

 

=>nginx 컨테이너 생성

docker run --name webserver1 -d -p 8001:80 nginx

 

-브라우저를 이용해서 구동중인지 확인

=>컨테이너 접속 로그 확인

docker logs -f webserver1

 

=>nginx의 기본 디렉토리: /usr/share/nginx/html/ 디렉토리

 

=>호스트 컴퓨터의 index.html 을 nginx 의 디렉토리로 복사

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

 

=>브라우저에서 localhost:8001 로 접속해서 변경된 내용을 확인

 

4)파일 복사 활용

=>데이터베이스 프로그램은 기본 설정이 로컬에서만 접속하도록 되어 있는데 이렇게 되면 외부에서 데이터베이스 사용을 못하는 경우가 있는데 셸에 직접 접속해서 설정을 변경해도 되고 설정 파일을 복사해와서 작업한 후 다시 컨테이너로 복사를 해도 됩니다.

=>웹 서버를 도커를 이용해서 배포하는 경우 정적 웹페이지를 컨테이너 내부에서 작성하면 어려운 일이므로 현재 컴퓨터에서 작업을 한 후 파일만 복사해서 사용하는 것이 작업하는데 편리

 

5)파이썬 실행 환경을 만들고 파이썬 파일을 복사해서 실행하는 이미지를 생성

=>파이썬 파일을 생성 -lotto.py

python lotto.py

from random import shuffle
from time import sleep
gamenum = input('로또 게임 횟수를 입력하세요')

for i in range(int(gamenum)):
	balls = [x+1 for x in range(45)]
	ret = []
	for j in range(6):
			shuffle(balls)
			number=balls.pop()
			ret.append(number)
	ret.sort()
	print('로또 번호 [%d]:' %(i+1), end=' ')
	print(ret)
	sleep(1)


-python lotto.py 를 실행해서 에러가 없는 것을 확인
-python 이미지 : python


=>파이썬 컨테이너를 실행
: docker run --name=python_test -dit -p 8900:8900 python
: name)은 아무거나
: terminal 접속하려면 IP가 필요
: 포트포워딩 하고 싶으면 8900:8900
→ 파이썬 환경이 실행됨
-현재 컴퓨터의 lotto.py 파일을 컨테이너에 복사
: docker cp lotto.py python_test:/
→ 루트 디렉토리로 복사

 

=>컨테이너의 셸에 접속

docker exec -it  python_test bash

-셸에서 파일 목록 확인:ls

-파이썬 설치 확인:python --version

 

=>셸에서 빠져나오기:exit

 

=>컨테이너를 이용해서 lotto.py파일 실행

docker exec -it python_test python /lotto.py

 

6)node 실행 환경

node.js:자바스크립트 개발 플랫폼
node.js:자바스크립트로 웹 서버를 만드는 프레임워크 X
node.js:express.js 나 nest.js 라는 프레임워크가 웹 서버를 자바스크립트로 만들 수 있는 프레임워크 O
자바스크립트는 브라우저 내부에서만 동작하는 프로그래밍 언어 자바스크립트로는 PC에서 동작하는 소프트웨어 개발이 안됩니다. C++ 을 이용해서 PC에서 동작하는 소프트웨어를 개발할 수 있으므로 C++ 코드를 JavaScript 문법으로 작성할 수 있도록 해주는 플랫폼이 node
MEAN - MERN
MongoDB: js 문법으로 데이터베이스 작업을 할 수 있도록 해주는 NoSQL
Express.js :웹 서버를 위한 node.js 프레임워크
Angular.js(React.js):SPA 작성을 위한 node.js 프레임워크
Node.js
스타트업이나 이쪽에서 node 를 할 수 있냐고 물어보는 것은 대부분 express.js 나 nest.js 를 의미

 

 

=>node 의 이미지 이름은 node 이고 명령은 node 파일명으로 파일을 실행-index.js

let http = require('http');
let content = function(req, res){
	res.end('Good Morning Docker'+'\n');
	res.writeHead(200);
}

let web = http.createServer(content);
web.listen(8000);

 

=>노드 컨테이너를 생성

docker run  --name=node.js -dit -p 9000:8000 node

 

=>컨테이너로 index.js 를 복사

docker cp index.js node.js:/index.js

 

=>외부에서 실행

docker exec -it node.js node /index.js

 

7)base image 에 원하는 레이어를 추가하고 이미지를 다시 만들어서 도커 허브에 배포

=>docker commit 명령은 현재 구동 중인 컨테이너를 이미지로 만드는 것

docker commit -a '설명문' 컨테이너이름 이미지이름

 

docker commit -a 'adam' python_test mypython

 

=>이미지 확인:docker images

 

=>이미지를 도커 허브에 업로느 하기 위해서는 이미지 이름 도커아이디/이미지이름:버전의 형태이어야 합니다. 그리고 이미지 이름만르오 다운로드 받도록 하기 위해서는 버전이 latest 이어야 합니다.

 

=>도커 허브에 업로드 할 수 있도록 태그 작성

docker tag mypython byeoungkwon/mypython

 

=>도커 허브에 업로드

docker push byeoungkwon/mypython 

 

=>도커 허브에서 다운로드 받아서 컨테이너를 실행하고 이전 명령을 수행

docker run -dit -p 8900:8900 --name mypython byeoungkwon/mypython

 

=>명령어 수행

docker exec -it mypython python/lotto.py

 

8)컨테이너를 이미지로 만들어서 업로드하고 다운로드 하는 것은 매우 중요

=>팀 단위 개발에서 환경을 동일하게 맞추는 것은 매우 중요한 작업

=>예전에는 팀원이 전부 모여서 각자의 컴퓨터에 필요한 소프트웨어를 설치해서 환경 구성을 했는데 최근에는 한 명의 리더가 개발 환경을 도커와 같은 컨테이너로 구현하고 다운로드 받도록 합니다.

=>버전 충돌 등의 문제를 안일으킬 수 있음

2. Volume

 
1) Volume
-컨테이너의 데이터를 반영구적으로 저장하는 것으로 스토리지의 한 영역을 분할한 것
-컨테이너 내부의 데이터는 컨테이너가 삭제되면 소멸되는데 이 데이터를 반영구적으로 보존하고자 하는 경우 현재 컴퓨터나 도커 엔진에 데이터를 저장하면 됩니다.
[[설명]]
프로젝트를 할 때 현재 컴퓨터에 MySQL을 설치
회원 가입을 구현하고 데이터베이스에 저장
배포하기 위해서 MySQL을 Cloud로 이전
: 회원 가입 정보가 MySQL 현재 컴퓨터에 있는데 어떻게 Cloud로 이전?
: 이 떄, 단순하게 컨테이너에 저장하게 되면 이전할 수 없고 “Volume”을 사용해야 함
: 데이터베이스 이미지는 거의 무조건 볼륨을 이용해서 데이터를 저장해야 합니다.
: 볼륨을 사용하는 또다른 이유는 여러 컨테이너가 데이터를 공유하기 위해서입니다.

2) 사용 방법
-bind mount : 현재 컴퓨터의 하드 디스크에 직접 연결
-volume mount : 도커 엔진에 연결
-tmpfs mount : 메모리에 연결, 임시적으로 연결

3) bind mount와 volume mount의 차이
-스토리지 영역이 bind mount는 디렉토리 또는 파일이지만 volume mount는 volume
-물리적 위치는 bind mount의 경우는 어디든 가능하지만 volume mount는 도커 엔진의 관리 영역
-마운트하는 절차가 bind mount는 파일 또는 디렉토리를 마운트하지만 volume mount는 volume을 생성한 후 마운트
-내용을 편집할 때 bind mount의 경우는 일반 파일 편집하듯이 하면 되고 volume mount는 도커 컨테이너를 통해서 수행
-bind mount는 백업이 쉽지만 volume mount는 백업이 어려움

4) 볼륨 마운트 영역 생성 및 삭제
-생성 : docker volume create 이름
-삭제 : docker volume rm 이름

5) 마운트 명령
- bind mount : docker run .. -v 실제경로:컨테이너마운트경로
- volume mount : docker run .. -v 볼륨이름:컨테이너마운트경로

6) 볼륨 마운트 실습
- my_appvol_1 이라는 볼륨을 생성
: docker volume create my_appvol_1
-볼륨 확인 명령
: docker volume ls
-특정 볼륨을 자세히 보기
: docker volume inspect my_appvol_1 (볼륨 이름)
 
→ 언제 만들어졌고 mountpoint가 어디인지 등 나옴
-볼륨과 연결해서 컨테이너를 생성 : 볼륨이 존재하면 존재하는 볼륨에 연결하고 볼륨이 존재하지 않으면 생성한 후 연결
- 이미지 우분투 가지고 수행
: docker run -d --name vol-test2 -v my_appvol_1:/var/log ubuntu:20.04
→ ubuntu20.04 이미지를 이용해서 vol-test2라는 컨테이너를 생성하는데 컨테이너 안의 /var/log 디렉토리와 my_appvol_1 볼륨이 연결됩니다. (var/log 디렉토리명)
: docker run -d --name vol-test3 -v my_appvol_2:/var/log ubuntu:20.04
→ ubuntu20.04 이미지를 이용해서 vol-test2라는 컨테이너를 생성하는데 컨테이너 안의 /var/log 디렉토리와 my_appvol_2 볼륨을 생성하고 연결됩니다.
: docker volume ls로 볼륨 생성 확인
-볼륨 삭제 : 볼륨을 사용하는 컨테이너가 존재하면 볼륨은 삭제되지 않음
: docker volume rm my_appvol_1
→ 에러 발생 : vol_test2 컨테이너가 볼륨을 사용중이기 때문
: docker stop vol-test2 vol-test3
: docker rm vol-test2 vol-test3
: docker volume rm my_appvol_1 my_appvol_2

7) 바인드 마운트
- 현재 컴퓨터에 디렉토리가 존재하지 않으면 생성하고 연결
- 실습
: httpd의 /usr/local/apache2/htdocs 디렉토리를 apa_folder(c드라이브-USER에 있는)와 마운트
-마운트 할 디렉토리를 생성 : apa_folder
-마운트 명령 수행(컨테이너 실행)
: docker run --name apa000ex20 -d -p 8090:80 -v C:\Users\USER\apa_folder:
/usr/local/apache2/htdocs httpd
→ 내컴퓨터의 apa_folder와 httpd의 htdocs 디렉토리와 연결
-브라우저 접속
: localhost:8090
-apa folder 디렉토리가 루트 디렉토리가 되어서 화면에 출력되는게 없음(index.html없음)
-apa_folder 디렉토리에 index.html 파일을 만들어주고 브라우저에서 새로 고침
→컴퓨터에 있는 디렉토리를 컨테이너가 연결해서 쓸 수 있음
: docker stop apa000ex20
: docker rm apa000ex20
: docker system prune (쓰지 않는 것 삭제)
: docker ls

8) tmpfs mount
- 일시적으로 마운트하는 것으로 메모리에만 지속되는 데이터를 활용하고자 하는 경우 사용
- 컨테이너가 제거되면 같이 제거됩니다.
- 임시로 빠르게 사용해야 하는 데이터가 있는 경우 사용합니다.
파일에 데이터가 존재하는 경우 메모리에 존재하는 것보다는 접근 속도가 느립니다.
-명령
--tmpfs 마운트할 컨테이너의 경로
-httpd:2 이미지의 /var/www/html 디렉토리를 임시로 마운트
: docker run -d--name tmpfs_mount --tmpfs /var/www/html httpd:2
CTRL+C 눌러서 강제 종료(-d없으면)
+ -d하면 백그라운드로 실행

 

9)MySQL 영속성 유지

=>MySQL 컨테이너를 생성해서 데이터를 저장한 후 MySQL 컨테이너를 삭제하고 다시 만들어도 이전 데이터가 유지

MySQL 5.7 은 설치할때 MYSQL_ROOT_PASSWORD 를 이용해서 관리자 비밀번호를 설정할 수 있고,

MYSQL_DATABASE 을 이용해서 데이터베이스 생성이 가능

 

기본적으로 데이터는 /var/lib/mysql 디렉토리에 저장됩니다.

나중에 혹시 어디선 되고 어디서 안되면 어떤 이미지를 다운로드 받아서 컨테이너로 만들고자 할 때 어떤 컴퓨터에서는 되고 어떤 컴퓨터에서는 안되면 플랫폼 차이일 가능성이 높습니다.

이런 경우에는 --platform 플랫폼 

 

MAC은 --platform linux/amd64 형태로 지정하면 됩니다.

 

=>MySQL 5.7 을 설치하고 영속성 확인

 

-볼륨을 생성

docker volume create mysql-data-vol

 

-볼륨을 확인

docker volume ls

 

-MySQL 5.7 컨테이너 생성

docker run -dit --name=mysql-vtest  -e MYSQL_ROOT_PASSWORD=wnddkd -e MYSQL_DATABASE=dockertest -v mysql-data-vol:/var/lib/mysql mysql:5.7

 

-컨테이너 접속

docker exec -it mysql-vtest bash

-셀에서 MySQL 접속

mysql -u유저 -p비밀번호 데이터베이스이름

앞에가 바뀜

-테이블 생성

create table mytable(c1 int, c2 char(100));

-데이터 추가

insert into mytable values(1,'adam');

commit;

 

-mysql 빠져나오기

exit

 

-콘솔종료

exit

 

-컨테이너 중지

docker stop mysql-vtest

 

-컨테이너 삭제

docker rm mysql-vtest

 

-MySQL 컨테이너 다시 생성

docker run -dit --name=mysql-vtest  -e MYSQL_ROOT_PASSWORD=wnddkd -e MYSQL_DATABASE=dockertest -v mysql-data-vol:/var/lib/mysql mysql:5.7

 

-MySQL bash에 접속

docker exec -it mysql-vtest bash

 

-MySQL을 실행시켜 접속

mysql -root -p비밀번호 mysql

 

-테이블 조회 구문 실행

select * from mytable;

 

-이전에 저장했던 데이터가 남아있음

데이터베이스를 도커에서 사용할 때는 이렇게 볼륨 마운트 나 스토리지 마운트를 설정하는 것이 좋습니다.

 

10)웹 서버의 로그 확인

=>웹 서버를 만들면 로그 디렉토리가 생성되고 그 안에 로그 파일이 만들어지게 되는데 컨테이너를 제거하면 로그파일이 사라지는데 스토리지 마운트 나 볼륨 마운트를 이용하면 로그 파일을 계속 유지할 수 있습니다

 

=>nginx 의 로그파일은 /var/log/nginx 디렉토리에 저장됩니다.

 

docker run -dit -p 8011:80 -v C:\Users\USER\nginx_logs:/var/log/nginx nginx

 

=>브라우저에서 localhost:8011 로 접속

 

=>C:/Users/USER/nginx_logs 디렉토리에서 로그 파일 생성

 

=>웹 로그를 저장하는 것도 거의 필수적인 사항이므로 항상 웹 서버를 만들 떄는 로그 디렉토리가 어디인지 확인하고 로그가 어떤 형식인지도 보고 로그 데이터를 반 영구적으로 저장할 수 있도록 해주어야 합니다.

 

11) 볼륨을 이용해서 컨테이너 사이의 데이터 공유
컨테이너에 연결된 볼륨이 같으면 데이터를 공유 가능
ubuntu 컨테이너를 2개 만들어서 볼륨을 이용해 데이터 공유
- 첫 번째 컨테이너를 생성
docker create -v /data-volume --name=datavol ubuntu

- 첫 번째 컨테이너를 실행하고 bash shell에 접속
docker run -it --volumes-from datavol ubuntu

- 파일을 생성
echo 'testing data container' > /data-volume/test-volume.txt

- ls /data-volume으로 파일 생성 여부 확인

- 텍스트 파일 내용
cat /data-volume/test-volume.txt

- 두 번째 컨테이너 생성
docker run -it --volumes-from datavol ubuntu

- 두 번째 컨테이너에서 텍스트 파일을 생성
echo 'testing data container2' > /data-volume/test-volume2.txt
 
파일이 두 개가 됨

3. Docker Network


1) 개요
•   도커 컨테이너 및 서비스는 도커 네트워크를 통해 격리된 컨테이너 간의 네트워크 연결뿐 아니라 도커 외의 애플리케이션 워크로드와도 연결이 가능
•   도커 설치를 하게 되면 docker0라는 소프트웨어적으로 구현된 가상 이더넷 브릿지 네트워크가 만들어지고 이것을 통해서 격리된 컨테이너들의 상호간 통신을 제공
•   기본적으로 172.17.0.0/16이라는 네트워크 대역을 이용해서 내부 네트워크를 연결
뒤의 16개의 숫자는 변경이 되더라도 하나의 네트워크로 간주
65536개의 컨테이너를 하나의 네트워크로 묶을 수 있음

2) 각 이미지가 별도의 IP Address를 할당 받는 것을 확인
•   2개의 ubuntu 컨테이너 생성
docker run -dit --name container1 ubuntu

docker run -dit --name container2 ubuntu

 

•   컨테이너 정보 확인
docker inspect container1

docker inspect container2
 
 
 

•   IP의 종류는 두 가지
o   public IP: 외부에서 식별하기 위한 주소, 포트와 합쳐지면 절대로 중복될 수 없음
o   private IP: 내부에서 식별하기 위한 주소, 포트와 합쳐지더라도 네트워크가 다르면 중복될 수 있음

 

3)WordPress 를 이용한 네트워크 생성 및 사용

=>워드프레스

-웹 사이트를 만들기 위한 소프트웨어

-워드프레스를 Apache 그릭고 데이터베이스 와 PHP 런타임이 반드시 사용가능해야만 동작하는 소프트웨어

-워드프레스의 공식 이미지는 아파치와 PHP 런타임을 가지고 있는데 데이터베이스는 가지고 있지 않으며 MySQL이나 MariaDB를 설치해서 연결해서 사용해야 합니다

-데이터베이스는 워드프레스만 접근해서 사용한다면 굳이 외부에 노출시킬 필요가 없습니다.

이런 경우에는 워드프레스와 묶어서 하나의 네트워크로 만들어 내부에서는 접근이 가능하지만 외부에서는 접근이 불가능하도록 해야 합니다.

 

=>네트워크 생성

docker network create 네트워크이름

 

=>rm, ls 명령을 이용해서 삭제와 조회가 가능

 

=>MySQL 컨테이너 생성시 필요한 옵션과 인자

docker run --name 컨테이너이름 -dit -net=네트워크이름 -e MYSQL_ROOT_PASSWORD=관리자비밀번호 -e MYSQL_DATABASE=생성할데이터베이스 -e MYSQL_USER=생성할유저아이디 -e MYSQL_PASSWORD=유저의비밀번호 -p 외부포트:내부포트 MYSQL 이미지이름 --characterset-set-server=문자인코딩 --collation-server=정렬순서 --default-authentication-plugin=인증 방식

 

-문자 인코딩은 utf8mb4 로 설정하는 것이 일반적

-정렬 순서는 uff8bm4_unicode_ci로 설정하는데 정렬은 utf8을 따름

-인증방식은 mysql_native_password 로 설정하는데 mysql 8.0 부터 이전의 방식이 아니라 토큰을 이용하는 방식으로 변경되었는데 원래 방식으로 사용하겠다고 설정합니다.

 

=>워드프레스 컨테이너 실행시 필요한 옵션과 인자

docker run --name 컨테이너이름 -dit -net=네트워크이름 -p 외부포트:내부포트 -e WORDPRESS_DB_HOST=데이터베이스컨테이너이름 -e WORDPRESS_DB_NAME=데이터베이스이름 -e WORDPESS_DB_USER=데이터베이스사용자아이디 WORDPRESS_DB_PASSWORD=사용자비밀번호

 

=>작업 순서

네트워크 생성 -> MySQL 컨테이너 생성 -> WordPress 컨테이너 생성 -> 확인

 

=>명령문

-네트워크 생성

docker network create wordpress000net1

 

-MYSQL 8.0 컨테이너 생성:포트를 설정하지 않음 -외부에서는 접근 안

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

 

-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

 

-컨테이너 확인

docker ps

 

-브라우저에 localhost:8085

 

=>정리 - 생성한 것의 역순으로 정리

 docker stop wordpress000ex12
docker stop mysql000ex11
docker rm wordpress000ex12
docker rm mysql000ex11
docker network rm wordpress000net1

 

=>MySQL 설정

-배시 접속

docker exec -it 컨테이너이름 bash

 

-루트로 접속

mysql -uroot -p비밀번호 데이터베이스

 

-데이터베이스 생성

create database 데이터베이스이름

 

-사용자 생성 및 비밀번호 설정

create user '유저아이디'@'접속할 IP 또는 *' identified by '비밀번호';

 

-사용자 권한 부여

grant all privileges on *.* TO '유저아이디'@'%'

*.* 은 모든 데이터베이스이고 %은 어느곳에서나 라는 의미

 

-외부 접속 허용

alter user '유저아이디'@'%'identified with mysql_native_password by '비밀번호';

 

-변경 내용 반영

flush privileges;

 

4)Maria DB 사용

=>MySQL 의 fork

=>MySQL이 Oracle 인수되면서 기존 MySQL 개발자들이 Open Source 로 만든 RDBMS

=>국내에서는 Kakao 가 Maria DB를 사용

=>컨테이너 생성

docker run --name 컨테이너이름 -dit -p 외부포트번호:3306 -e MYSQL_ROOT_PASSWORD=관리자비밀번호 mariadb

 

=>외부에서 접속 가능하도록 설정

-bash 에 접속

docker exec -it 컨테이너이름 bash

 

-편집을 위해서 vim을 설치

apt-get update

apt-get upgrade

apt-get install vim

 

-외부 접근 파일을 수정

vim /etc/mysql/mariadb.conf/d/50-server.cnf

 

bind-address 값을 0.0.0.0 (IP에 상관없이를 의미하는 것으로 *로 설정하는 경우도 있음)으로 수정

192.168.1.0(192.168.1.1 ~ 192.168.1.255)

192.168.0.0(192.168.0.1 ~ 192.168.255.255)

 

=>실습

docker run --name mariadb -dit -p 3306:3306 -e MYSQL_ROOT_PASSWORD=wnddkd mariadb

 

docker exec -it mariadb bash

 

apt-get update

apt-get upgrade

apt-get install vim

 

vim /etc/mysql/mariadb.conf.d/50-server.cnf 명령을 수행 후 bind-address 부분의 주석을 해제하고 127.0.0.1 을 0.0.0.0 으로 수정

 

4.YAML

1)프로그래밍이나 프레임워크에서 환경설정하는 방법 

=>하드 코딩 이용:소스 코드 안에 환경 설정하는 부분을 작성

=>별도의 설정 파일을 이용하는 방법

-properties: 속성=값의 형태로 작성하는 방식, key와 value 형태로 작성하는데 여러개의 설정을 묶을 수 없음

 

-xml:태그형식으로 설정하는 방식, 태그 이름이 속성이 되고 태그 안의 내용이 값이 되는 구조,예전에 많이 사용하던 방식

 

-json:자바스크립트 객체 표현법으로 설정

 

-yaml

 

2)yaml

=>사람이 읽을 수 있는 데이터 직렬화 언어로 이메일 표현법을 이용

=>환경 설정 파일에 많이 이용

cloud 분야에서는 대부분의 경우 설정이 json 아니면 yaml 

최근에는 AI 분야도 확장

=>yet another markup language 또는 ain't markup language

=>사람이 읽기 쉬움

=>확장자는 yml 또는 yaml

=>JSON의 상위 집합이어서 JSON 파일을 사용할 수 있음

=>괄호가 없고 python의 들여쓰기 스타일을 이용

탭 사용 안됨

=>주석은 #으로 시작하고 여러줄 주석은 안됨

=>들여쓰기는 2칸이나 4칸을 이용

 

3)기본 문법

=>객체

-JSON

{

        "apiVersion":"v1",

        "kind":"Pod",

        "metadata":{

                               "name":"echo",

                               "labels":{

                                              "type":"app"

                                            }

                             }

}

 

-YAML

apiVersion: v1 #:과 속성은 붙여쓰고 값은 1개의 공백

kind:Pod

metadata:

    name:echo

    labels:

           type:app

           

 

=>배열

-JSON

{

person:{

             "job":"developer",

             "skills":["docker","kubernetes"]

            }

}

 

-YAML

person:

  job:developer

 skills:

   -docker

   -kubernetes

 

 

=>값 표현

- 참/거짓: true/false , yes/no

- 숫자나 문자열 모두 따옴표를 하지 않아도 되지만 숫자 형태로 만들어진 문자열의 경우는 ""을 붙임

숫자 1.2 문자열 "1.2"

 

=>줄바꿈은 | 인데 값이 끝날 때까지 1번만 사용

-json

{

         "newslines_sample":"number one line\n\nsecond line \n\nlast line\n

}

 

-YAML(맨 마지막에서는 줄 바꿈을 안함)

newslines_smaple : |-

number one line

 

second line

 

last line

 

-YAML(중간에 들어간 빈 줄 무시)

newslines_smaple : |>

number one line

 

second line

 

last line

 

4)JSON 과의 변환을 자동으로 해주는 사이트

=>https://www.json2yaml.com

=>https://yamlint.com

 

5)yaml의 시작과 끝

=>야믈의 시작과 끝을 나타내는 기호는 선택

=>시작은 ---(대시 3개)

=>끝은 ...(점 3개)

 

5.Dockerfile

1)IaC(Infrastucture as Code, 코드형 인프라)

=>수동 프로세스가 아닌 코드를 통해서 인프라를 관리하고 프로비저닝 하는 것

=>인프라 사양을 담은 구성 파일을 생성해서 편집해서 배포를 수행하게 되는데 배포가 쉬워지고 동일한 환경을 프로비저닝 하도록 보장

=>구성 사양을 코드화 하고 문서화함으로써 구성 관리를 지원하고 구성 변경 사항을 문서화 하지 않고 임시로 변경하는 일을 막을 수 있음

변경할 때 주의할 점은 변경한 내역을 문서화하지 않아서 어떤 부분을 변경했는지 알지 못하는 경우가 발생하는데 인프라를 코드로 만들어두면 그런 경우를 방지

=>인프라를 모듈식 구성 요소로 분할하고 자동화를 통해서 다양한 방식으로 결합을 할 수 있음

=>IaC 로 인프라 프로비저닝을 자동화하면 애플리케이션을 개발하거나 배포할 때마다 개발자가 직접 서버,운영체제,스토리지, 기타 인프라 구성 요소를 프로비저닝하고 관리할 필요가 없어집니다.

=>이 작업은 수동으로 할 수 있고 git hub action 이나 Red Hat 의 Ansible 을 이용해서 자동화할 수 있습니다.최근에는 이 개념을 이용해서 소스코드를 작성하고 commit 이나 push 만 하면 자동으로 배포되도록 할 수 있습니다.

 

2)Dockerfile 개요 및 장점

=>개요

-Docker Image 를 생성하기 위한 스크립트 파일

-여러가지 명령어를 토대로 Dockerfile 을 작성한 후 빌드하면 Docker는 Dockerfile에 나열된 명령문을 차례대로 수행해서 이미지 생성

 

=>장점

-이미지가 어떻게 만들어졌는지를 알 수 있음(기록)

-배포에 용이

 

3)최적의 Dockerfile

=>경량의 컨테이너 서비스를 제공하기 위해서는 최소한의 설정과 구성을 권장

=>레이어를 최소화

-Dockerfile에서는 명령어의 수와 레이어의 수가 같기 떄문에 명령어의 수가 많으면 레이어의 수가 많아지고 이렇게 되면 빌드 시간이 길어지고 파일용량도 커짐

=>하나의 애플리케이션은 하나의 컨테이너로 생성

마이크로서비스를 이렇게 컨테이너 하나로 보기도 하고 Dockerfile 하나로 만들기도 합니다

=>캐시 기능 활용

=>IaC 개발은 디렉토리 단위: 디렉토리 안에 상관없이 파일이 없도록 해주어야 합니다

=>Serverless 환경으로 개발

Serverless 는 서버가 없다는 의미가 서버를 직접 만들지 않는다라는 의미

public cloud 나 private cloud 등을 이용해서 직접 서버 구축을 하지 않고 서버의 기능을 구현하라는 의미

 

4)작성 명령어

=>FROM

-베이스 이미지를 지정

-도커 허브의 공식 이미지를 사용하기를 권장

-작은 크기의 이미지인 slim 이나 alpine을 권장

 

=>MAINTAINER

-이미지를 빌드한 작성자 이름과 이메일을 권장

-선택 사항

 

=>LABEL

-이미지 작성 목적으로 여러 개 사용가능

-버전,타이틀, 설명,라이선스 정보 등을 기재

일반적인 개발자들은 라이선스는 작성하지 않지만 일반 애플리케이션이 아닌 플랫폼 관련 기업들은 라이선스 부분을 명확하게 기재

 

=>RUN

-기본 이미지에 수행할 명령을 작성

-여러개 작성 가능

RUN apt update & apt install -y nginx

 

=>CMD

-생성된 이미지를 컨테이너로 실행할 때 수행하는 명령

-ENTRYPOINT 명령문으로 지정된 커맨드에 디폴트로 넘길 파라미터 지정에도 사용

-실행할 떄 데몬이 실행되도록 하는 경우에 우ㅠ용

 

CMD["/usr/sbin/apachectl","-D","FOREGROUND"]

CMD apachectl -D FOREGROUND

apachectl 이라는 명령을 데몬으로 포그라운드에서 실행

 

-연속해서 여러개 작성하면 마지막 하나의 명령문만 수행

 

 

=>ENTRYPOINT

-생성된 이미지를 컨테이너로 실행할 때 수행하는 명령인데 CMD로부터 파라미터를 넘겨받아서 실행이 가능

-ENTRYPOINT 와 CMD 을 묶으면 여러 개의 명령을 수행하는 것이 가능

-runapp.py 파일을 실행

 

CMD["python","runapp.py"]

 

ENTRYPOINT ["python"]

CMD["runapp.py"]

 

-ENTRYPOINT 는 컨테이너 실행 시 항상 수행해야 하는 명령어를 지정하는데 사용하고 CMD는 다양한 명령어를 지정하는 경우에 사용

 

 

 

 

 

 

'Study > Cloud,Docker,Kubernetes' 카테고리의 다른 글

Kubernetes  (0) 2024.04.08
Docker(4)-DockerCompose  (0) 2024.04.06
Docker(3)-Dockerfile  (0) 2024.04.04
Docker(1)  (0) 2024.04.02
Cloud(1)-개요  (0) 2024.04.01