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 |