[4일차 시작]
ㅁ
- 컨ㅌ네이너는 쉽게 가상서버다. 근데 애플리케이션에 동작하는ㄷ ㅔ필욯나 필수 파일들만 들어가 있는.
애플리케이션이 동작하는ㄷ ㅔ필요한 파일들만 한 군데다가 집어놓고 격ㄱ리시켜놓은거다.
- 버츄얼 박스에다가 여러 vm을 깔 수 있는 것처럼 여러 컨테이
- docker image ls
1번째 장점. 용량이 적은 걸 볼 수 있다. 경량이다.
2번재 장점. 컨테이너 이미지를 만들 때ㅔ 우리가 필요한 것들을 다 집어놓고 설정을하고 그 이미질 ㅗ컨테이너를 ㅁ나들면 매번 환경설정을 해줄 필요가 없다. 환경설정을 매번 할 필요 없다.
- 도커는 컨테이너와 다르다.
컨테이너는 리눅스 기술이다. 도커는 컨테이너를 제어하는 엔진이다. 컨테이너를 관리하는 플랫폼이다.
도커 없어도 컨테이너는 쓸 수 있다. 다른걸로. 예를들어 파드맨 같은걸로.
컨테이너를 뭐로 다룰찌는 선택이다. 그 중의 하나로 도커가 유명해져서 도커가 컨테이너처럼 느껴지는 것뿐이다.
- 컨테이너를 만드려면 이미지가 필요하다.
이미지가 있어야 컨테이너를 만들 수 있다. 클래스가 있어야 인스턴스를 만드는 것처럼.
- 이미지는 로컬에 있을 수도 있고 없으면 저장소에서 다운받는다.
그 저장소는 도커에서 제공하는 공식 저장소가 있고 사설 저장소도 있다.
내가 만든 이미지를 도커허브에 올려서 서로 공유할 수도 있다.
- 이미지를 생성할 때 생성하는 방법은 원래 os(우분투나 엔진엑스가 설치된상태)로 이미지를 만들 수 있다.
원초적인 방법인데 번거롭다. 도커허브에 이미 만들어진 이미지도 많고. pull로 다운받아서 사용한다.
- 그리고 설정을 통해서 내가 새로운 이미지를 생성했다. 허브에 올리는건 push라고 한다.
- 로컬에 저장하는건 save, 로컬에 있는걸 다시 올리는건 load다. 이미지를 백업같은 개념으로.
- 여러분이 주로 쓰는건 pull, push.
- 이미지 가지로 run을 시키면 컨테이너가 만들어진다.
docker pull로 이미지를 다운받는다, 그리고 docker create로 컨테이너를 만든다. docker start 컨테이너를 시작시킨다.
여기까지 해야 컨테이너가 동작한다.
이 3개를 합쳐서 run으로 사용할 수 있다. run을 쓰면 이미지가 없으면 pull로 다운받고, 크리에이트해주고, start까지 해준다.
- run이나 start하면 컨테이너가 동작한다. 그 얘기는 서비스가 동작한단 얘기다.
- 커밋은 컨테이너에 설정을 하고나서 다시 이미지로 만드는 거다. 컨테이너의 변경된점을 반영시켜서 다시 이미지로 만드는게 커밋이다.
커밋이 동작중인 컨테이너를 가지고 이미지를 만드는 것이다.
- 바뀐 이미지를 push해서 서로 공유하고.
개발환경에서 만들어진 이미지 가지고 공유해서 배포서버에다가 똑같은 환경으로 동작시킨다.
- 동작중인 컨테이너에는 stop, start, restart 명령을 할 수 있다.
- tag는 이미지를 구분하는 것이다.
보통은 이미지 버전이다. 태그를 붙여서 이미지를 구분한다.
커밋할 때도 기존에 있던 이미지에서 내용이 추가돼서 새로운 이미지가 되는거니까 태그를 수정해서 분류한다.
- dockerfile은 그 안에다가 원래 내가 우분ㅌ누 컨테이너를 생성하는ㄷ ㅔ거기에 필요한 파일들(업데이트도 하고, net-tools도 깔고) 등의 과정을 Dockerfile에다가 배치파일처럼 기록을 해놓는다. 그럼 dockerfile에 기록한대로 이미지를 만들어주게 된다.
컨테이너를 만드려면 이미지가 필요한데 여러분이 쓸수있는 일반적인 방법은 이미지를 다운받거나 혹은 dockerfile을 이용해서 이미지를 만들어내거나. 2가지다.
우리는 나중에 dockerfile 방법을 쓸거다. 왜냐면 컨테이너 이미지 안에 우리가 필요한 내용들이 들어가있어야 하기 때문이다.
- pull 뒤에 명령어를 쓰는데 repository만 적게되면 ~.
뒤에 tag를 생략하면 latest가 추가된다.
태그는 이미지를 구분하기 위한 값인데 일반적으로 버전이다.
- 저장소하면 좀 헷갈리긴 하는데 저장소 명이 저 프로그램, 패키지 명이라고 봐도 된다.
- 그래서 내가 특정 버전을 다운받고 싶으면 뒤에 콜론을 붙이고 태그를 쓰면 해당 버전을 다운받을 수 있따.
- 목록 확인하 ㄹ때는 docker image ls혹은 docker image list. 혹은 docker images. 다 똑같은 명령이다.
- 이미지 삭제하는거.
image rm 이미지 적으면 이미지 삭제한다.
이미미지 이름은(reopository)는 전체를 다 적어줘야 한다. 태그까지. 이미지 아이디는 구분될정도로 한, 두글자만 적어도 되서 편하고.
- 위의 둘은 똑같은 명령어다.
- 동작중이어서 삭제 불가능하다.
- 이 옵션은 공통적으로 다 쓰이는 옵션이다. f 옵션을 사용하면 강제로 삭제할 수 있따.(실제 삭제하진 않았음)
- inspect는 이미지든 컨테이너든 자세한 정보를 출력해주는 명령이다.
한개의 파일에 layer들이 쌓여있다.
- run을 많이 쓴다. 안쓰려면 pull, create, start.
아래는 기억하세요.
- --name
- -d
- -e
- --expose는 알려준기만 하는거지 실제 노출은 아님. -p를 해야 노출됨.
- run하고 컨테이너 내부에 접속할 때 -i, -t를 씀.
이런 옵션들을 써서 run 명령을 할 수 있따.
- 그리고 이렇게 동작한 컨테이너를 확인할 때는 ps를 쓴다.ps는 프로세스다. 현재 이 터미널에서 실행되는 프로세스. 컨테이너는 현재 메모리 상에서 동작되는 프로세스다.
- 멈춰있는 모든 컨테이너까지 다 보려면 docker ps -a를 쓴다.
- clear
로 지울수 있다. 화면을
docker pull tomcat:10
- 톰캣인데 10번 버전을 다운받는다. 물론 이름이 잘못되거나 없으면 없다고 나온다.
docker image ls
- 다운받았으면 docker image ls로 확인할 수 있다.
docker create tomcat:10
docker ps하면 컨테이너를 출력해주는 건데 현재 동작중인 running중인 컨테이넘나 출력된다.
동작중이지 않은것도 출력하려면
docker ps -a하면 모두 출력된다.
근데 이름을 안붙이면 자동으로 아무거나 붙는다.
docker start ps
실행시킨다.
그리고 ps로 다시 확인하면 보인다.
ㅁ inspect 하면 컨테이너의 ip가 나온다.
그리고 접속해본다. curl 172.17.0.2:8080
톰캣이 기본 포트가 8080이니까.
- 404는 오류가 아니다. 톰캣은 동작중이다. 파일이 없어서 404가 뜬것뿐이다.
ㅁ docker ps
- 도커 이름 확인
ㅁ docker exec strange_mirzakhani ls
- ls하면 webapps가 있다.
ㅁ docker exec strange_mirzakhani ls webapps
- webapps 안엔 아무것도 없다.
ㅁ docker exec strange_mirzakhani mkdir webapps/ROOT
- webapps 아래에 ROOT 디렉토리를 만들어본다.
ㅁ docker exec strange_mirzakhani ls webapps
ROOT 디렉토리가 만들어진걸 볼 수 있따.
ㅁ echo "<h1> Hello, Tomcat</h1>" > index.jsp
- index.jsp를 만든다.
echo라는 명령은 원래 큰따옴표 안의 내용을 화면ㅇ ㅔ찍어준느 명령어인데 그러지말고 파일에 찍으라는거다.
ㅁ ls
ㅁ docker cp index.jsp strange_mirzakhani:/usr/local/tomcat/webapps/ROOT
- index.jsp를 복사해서 ROOT에 놓는다.
ㅁ curl 172.17.0.2:8080
- hello tomcat이 뜨는지 본다.
아까는 not found였는데 이번엔 index.jsp의 내용을 보여준다.
※
docker start 컨테이너명|컨테이너ID
docker exec 컨테이너명 명령
docker exec 컨테이너명 ls
docker exec 컨테이너명 mkdir webapps/ROOT
echo "<h1> Hello, Tomcat </h1>" > index.jsp
docker cp 복사할파일 컨테이너명:복사할디렉토리
docker cp index.jsp 컨테이너명:/usr/local/tomcat/webapps/ROOT
curl 172.17.0.2:8080
- exec로 컨테이너 내부에 명령을 할 수 있따.
==============================================
[2교시]
ㅁ curl localhost:8080
하면 연결이 거부된다. 외부에선 안된다.
ㅁ netstat -ntlp
하면 여기에 8080포트가 없다. 여기서 리스닝 중이어야 내가 접속할 수 있다.
왜 없냐면 create할 때 start할 때 포트를 외부에 노출을 안시킨거다.
ㅁ docker ps
ㅁ docker stop ca
ㅁ docker start -p 8080:8080 ca
ㅁ docker ps
docker ps-a
- 이러면 동작중인것도 없고, 전체를 찾아봐도 톰캣은 없다.
ㅁ docker create --name=tomcat10 -p 8080:8080 tomcat:10
- 아까만들땐 이름도 안줬고, 포튿 ㅗ외붕 ㅔ노출을 안시켰다.
이번엔 이름도 줬고 외부와 내부의 8080을 연결시켰다. 이래야 외부에서 접속할 수 있다.
-p 옵션을 해야만 외부에 노출시킬 수있따.
ㅁ docker start tomcat10
- 포트포워딩 되어있다. 0.0.0.0:8080으로 돌아오면 안쪽의 컨테이너의 8080으로 연결시켜주겠다.
ㅁ curl localhost:8080
- not found 뜬다. 아까 우리가 index파일을 집어넣은 컨테이너는 삭제했기 때문이다.
- 브라우저에서 아이피주소:8080하면 404가 뜬다.
ㅁ docker rm tomcat10
- 동작중이라 안지워진다.
ㅁ docker rm -f tomcat10
- -f 옵션을 지우면 삭제된다ㅣ.
docker create --name=컨테이너명 -p 호스트port:8080컨테이너port 컨테이너이미지
ㅁ docker create --name=tomcat10 -p 8080:8080 tomcat:10
- 80으로 접속하면 컨테이너 내부의 8080으로 접속시켜주겠다.
그럼 웹브라우저로 접속할때 뒤에 8080을 안붙여도 된다.
- 내부적으로 쓸 게아니라면 웹애플리케이션은 다 외부에 노출시켜야 되니까 써줘야한다 -p를.
ㅁ docker start tomcat10
ㅁ 브라우저에서 ip주소:80하면 된다. :8080은 안된다.
컨테이너 내부의 동작하느 ㄴ포트가 중요한게 아니라 내가 접근할 때 어떠 ㄴ포트로 접근할지가 중요한거다.
ㅁ 컨테이너 로그 확인하기
- docker logs 컨테이너명
하면 이 컨에너가 동작하면서 ~ 로그를 볼 수 있다.
- docker logs -f 컨테이너명
하면 파일이 열려있는 상태로 추가적으로 실시간으로 로그 내용을 볼 수 있다.
- 보통 언제 로그를 확인하냐면 백그라운드로 동작 시켰을 때.
백그라운드 동작은 화면에 출력이 안되니까 로그를 볼 수가 없어서 백그라운드로 동작시켜놓고 로그를 봐서 어디 문제 있는지 확인한다.
ㅁ 컨테이너 접속하기
- docker exec -i -t 컨테이너명 bash
뒤의 bash라고하는 쉘을 동작시키겠다. 이러면 컨테이너 내부에 접속이 된다.
하나로 합쳐서 -it해도 된다.
- 일반적으론 exec로 컨테이너 내부에 접속한다.
- exec가 컨테이너 내부에 명령을 전달한다.
저런 명령은 명령을 수행하고 끝나는데, shell은 내가 셸을 받는다.
docker exec -it 컨테이너명 bash -> 컨테이너에 접속해서 bash 셸을 부여받음.
- 위 두장은 아까 본거다.
- exec는 내부 명령이다. 컨테이너 내부에 명령을 전달한다.
- tomcat의 루트디렉토리는 물론 다르게 설치할 수도 있지만, /usr/local/tomcat/webapps/ROOT다.
- 컨테이너를 만들고 삭제하면 컨테이너 내부에 있던 게 싹 다 사라져버린다.
- ROOT 디렉토리에 파일을 추가한 후 동작중인 상태에서 컨테이너를 종료하고 삭제하면,
ROOT 디렉토리의 파일도 함께 삭제된다.
- mysql 컨테이너를 생성하고 사용할 때 데이터는 컨테이너 내부에 저장된다.
따라서 컨테이너 삭제시 데이터도 함께 삭제된다.
컨테이너를 지우면 데이터도 다 삭제된다.
- 근데 데이터베이스 안의 데이터는 삭제되면 안되고 써야하는 데이터다.
마찬가지로 ROOT 디렉토리의 파일들도 써야 한다.
- 처음 websvr1이라는 컨테이너를 만들었다.
그리고 또 컨테이너 이미지로 websvr2를 만들었따.
- 똑같은 웹서버를 2대 운영중이다.
이때 websvr1에서 어떤 변경사항이 있으면 다른데서도 다 바꿔줘야 한다.
- 그렇게 한번 바뀔때마다 일일이 동기화시키지 않고 데이터를 한곳에 빼놓으면 모든 websvr들에서 서버가 몇개든 같은 데이터를 쓰게 된다.
이게 볼륨이다.
- 도커 볼륨은 컨테이너가 컨테이너 내부에 데이터를 저장해야 하는데 내부에 저장하는 데이터랑 바깥의 특정 지점이랑 연동을 시켜놔서 외부에 두고, 그걸 변경시키면 컨테이너도에서 볼륨르 사용하고, 컨테이너를 삭제해도 볼륨은 남아있다.
- 실제 컨테이너에서 volume을 만들어서 사용할 수 있고, bind mount로 내가 원하는 디렉토리를 컨테이너와 연결해서 사용할 수 있다. 둘 다 많이 쓰인다. 어쨋든 둘 다 외부에 있다. 호스트가 가지고 있다 데이터를.
- 파일을 컨테이너 내부에 복사할 필요없이 호스트에 파일을 저장하면 컨테이너가 그걸 읽어들인다.
- 컨테이너의 /var/lib/mysql 디렉토리를 home밑의 ~/mariadb-vol 디렉토리를 연결시키기.
그럼 컨테이너를 삭제해도 ~/mariadb-vol는 남아있다.
- bind mount 방식
docker run -it -v ~/mariadb-vol:/var/lib/mysql --name=mydb mariadb bash
이 디렉토리( mysql )가 없는데 생성이돼요. 그리고 연결이 됩니다.
- 내가 컨테이너의 어떤 위치랑 연결시킬지. 그게 mysql이다.
이름은 mydb 이미지는 mariadb 쉘은 bash를 ㅡㅆ겠다.
- 이미지가 없으니 이미지를 다운받는다.
○ exit
- root에서 나와서 admin1로 돌아온다.
○ docker run -it -v ~/mariadb-vol:/var/lib/mysql --name=mydb mariadb bash
○ docker run -d --name=mydb -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 mysql
- -e가 환경변수 설정하는 거다.
○ docker exec -it mydb bash
- 여기까지 하면 이제 접속이 되야하는데 지금 안되서 확인을 해볼게요.
○ mysql -uroot -p
- bash에 들어가면 이걸 한다.
[나중추가]
docker rm -f mydb5
docker run -d --name=mydb5 -e MARIADB_ROOT_PASSWORD=1234 mariadb:latest
- 이렇게 하면 접속된다. 근데 볼륨 연결이 안되어있어서 날려버리면 다 사라진다.
- mysql에 접속은 된다.
- exit로 나간다.
○ ls /var/lib/mysql
-여기가 디비가 저장되느 ㄴ디렉토리다.
○ docker rm -f mydb
- 컨테이너 생성할 때 썼떤 볼륨을 써볼게요.
○ docker run -d --name=mydb -v ~/mysql-vol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 mysql
ㅁ ls
ㅁ ls mysql-vol/
- 하면 파일들이 들어와있다. 볼륨으로 잡아놓은 디렉토리에 컨테이너 내부의 var/lib/mysql으 ㅣ파일들이 그대로 들어와있따.
○ docker exec -it mydb bash
○ mysql -uroot -p
ㅁ create database testdb;
ㅁ grant all privileges on testdb.* to admin@localhost identified by '1234';
- 에러나서 안함.
- 마리아디비 설치하고 서비슥 ㅏ안되는건 샘이 확인.
ㅁ show databases;
- testdb가 있따.
ㅁ exit
ㅁ admin에서 docker rm -f mydb
- 컨테이너를 삭제했다.
ㅁ ls mysql-vol/
- 하면 여기에는 남아있음. 이걸 이용해서 mysql 을 생성할때 이걸 연결해주면 데이터가 그대로 살아있다.
○ docker run -d --name=mydb2 -v ~/mysql-vol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 mysql
- 이름 바꿨다.
- 볼륨 연결은 하는거다 -v가.
- 접속했을때 테스트 db가 살아있으면 된다.
ㅁ 그리고 다시 ~ show databases까지 하면
- tesetdb가 살아ㅣㅇㅆ음을 확인할 수 있따.
- 컨테이너가 삭제되어도 데이터는 보존된다.
ㅁ docker rm -f tomcat10
- rm으로 톰캣10 지웠음.
ㅁ docker run -d --name=tomcat10 -v ~/webapps:/usr/local/tomcat/webapps -p 80:8080 tomcat:10
- 아까랑 달라진 점은 -v ~/webapps:/usr/local/tomcat/webapps가 들어갔다.
컨테이너 내부 디렉토리랑 여기랑 연결시켜놨다.
ㅁ cd webapps
ㅁ sudo mkdir ROOT
ㅁ sudo cp ../index.jsp .
- 하나 위에있는 index.jsp를 현재 디렉토리로 카피해온다.
ㅁ sudo cp index.jsp ROOT
ㅁ ls ROOT/
ㅁ 이러고 브라우저에 접속하면 된다.
- 컨테이너 쓸 때 볼륨은 무조건 쓴다.
[3교시끝]
[배포수업4일차 txt 지금까지]
docker start 컨테이너명|컨테이너ID
docker exec 컨테이너명 명령
docker exec quizzical_diffie ls
docker exec quizzical_diffie mkdir webapps/ROOT
docker exec -it quizzical_diffie bash => 컨테이너에 접속해서 bash 셸을 부여받음.
echo "<h1> Hello, Tomcat </h1>" > index.jsp
docker cp 복사할파일 컨테이너명:복사할디렉토리
docker cp index.jsp quizzical_diffie:/usr/local/tomcat/webapps/ROOT
curl 172.17.0.2:8080
docker create --name=컨테이너명 -p 호스트port:컨테이너port 컨테이너이미지
=====================================================
tomcat의 루트디렉토리 : /usr/local/tomcat/webapps/ROOT
ROOT 디렉토리에 파일을 추가한 후 동작중인 상태에서 컨테이너를 종료하고 삭제하면
ROOT 디렉토리의 파일도 함께 삭제가 됨.
mysql 컨테이너를 생성하고 사용할 때 데이터는 컨테이너 내부에 저장됨.
따라서 컨테이너를 삭제하면 데이터도 함께 삭제됨.
- bind mount : 호스트의 특정 디렉토리를 컨테이너의 특정 디렉토리와 연동
docker run -it -v ~/mariadb-vol:/var/lib/mysql --name=mydb mariadb bash
docker run -d --name=mydb -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 mysql
docker exec -it mydb bash
#mysql -uroot -p
1234
docker run -d --name=mydb -v ~/mysql-vol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 -p 3306:3306 mysql
docker exec -it mydb bash
#mysql -uroot -p
1234
create database testdb;
grant all privileges on testdb.* to admin@localhost identified by 1234;
flush privileges;
docker run -d --name=tomcat10 -v ~/webapps:/usr/local/tomcat/webapps -p 80:8080 tomcat:10
cd ~/webapps
sudo mkdir ROOT
sudo cp ../index.jsp ROOT
docker run -d --name mydb5 -e MARIADB_ROOT_PASSWORD=1234 mariadb:latest
- volume 생성 후에 컨테이너에 사용하기
=====================================================================================
'배포 > Docker' 카테고리의 다른 글
4. Dockerfile (2) | 2024.12.09 |
---|---|
2. 이미지파일 다운&업로드 (1) | 2024.12.09 |
1. Docker 설명 (0) | 2024.12.08 |
11. 이미지파일 다운&업로드 (2) | 2024.12.06 |
10. Docker 설명 (3) | 2024.12.06 |