kakao Cloud school 2기 D+25

LEE EUI JOO·2022년 12월 5일
0

Docker

목록 보기
2/8

1. Docker

  • 리눅스 커널
  1. C group (control group) : 하드웨어 자원 (CPU, RAM 등)을 할당
  2. Name Space (chroot) : 격리된 공간을 제공
  • Docker 와 VM 의 차이

  • 컨테이너 이미지 (Image) : 컨테이너 동작을 위해 필요한 운영체제 , APP

  • 이미지를 실행한 상태가 컨테이너

2. Ubuntu 운영체제 위에서 Docker 실습

  • 초기 화면 - IP : 211.183.3.50

  • user 의 password 바꾸는 법
user1@ubuntu:~$ sudo passwd root
[sudo] password for user1: 
New password: 
Retype new password: 
passwd: password updated successfully

  • root 계정 로그인 방법
user1@ubuntu:~$ su
Password: 
root@ubuntu:/home/user1# 

  • sshd 설정 파일에서 루트 접속 거부해놓은 상태
<루트접속 거부 해제>

root@ubuntu:/home/user1# vi /etc/ssh/sshd_config

주석해제 하고 permit 허용 : yes 로 변경 


  • IP 설정하는 법 / 권한이 없으면 앞에 sudo
root@ubuntu:~# sudo vi /etc/netplan/00-installer-config.yaml 
IP 수정 

root@ubuntu:~# netplan apply
변경 적용 명령어


  • Docker 설치
nginx = 웹서버
centos 7의 yum = apt, apt-get

root@ubuntu:~# curl -ssL https://get.docker.com/ | bash

root@ubuntu:~# docker -v
Docker version 20.10.21, build baeda1f

  • 컨테이너 생성
    컨테이너 이미지 : 컨테이너 동작을 위해 필요한 운영체제, app
root@ubuntu:~# docker run httpd  	 # 컨테이너를 만든 다음에 실행시켜라

Unable to find image 'httpd:latest' locally  # 로컬에서 이미지를 찾을 수 없다
latest: Pulling from library/httpd
a603fa5e3b41: Pull complete 
4691bd33efec: Pull complete 	# pull : 이미지를 땡겨온다(download)
ff7b0b8c417a: Pull complete 
9df1012343c7: Pull complete 
b1c114085b25: Pull complete 

  • Ctrl + c 를 이용하여 중단시켜보기
root@ubuntu:~# docker ps
실행중인 컨테이너 보기

root@ubuntu:~# docker ps -a
모든 컨테이너 보기
  • 컨테이너 ID / NAME 이 존재 - 컨테이너를 특정할 수 있음'


  • 컨테이너 삭제하기 (컨테이너 ID)
root@ubuntu:~# docker rm -f 8084d5d22efb


  • Docker 실행 시켜 보기
  1. 이름 지정 : --name

  2. 백그라운드에서 동작 : -d (detached)

  3. docker hub : Official 한 이미지가 존재하고, 다른 사용자가 개인적으로 만든 이미지가 존재한다.

root@ubuntu:~# docker run --name test -d httpd
test 라는 이름의 컨테이너 생성

root@ubuntu:~# docker ps


  • 지금 Machine 을 하나 띄어놓은 상태라고 생각하면 되고, 이 머신은 어떤 공간(네트워크)에 놓여있을 것이다.
root@ubuntu:~# docker network ls

<세가지 네트워크 존재>

host : Bridge 대역대
bridge : NAT 대역대

<네트워크 자세히 살펴보기>
root@ubuntu:~# docker network inspect bridge

* 서브넷에 중점을 두면 된다 
  • test 라는 컨테이너가 띄어져 있는 것을 확인 할 수 있음


  • 컨테이너 자세히 (inspect)
root@ubuntu:~# docker inspect test

root@ubuntu:~# curl 172.17.0.2 
컨테이너가 잘 동작하는지 curl 명령어로 확인할 수 있음

root@ubuntu:~# docker image ls
어느정도의 크기를 가지고 있고 tag는 version 을 의미한다

<컨테이너의 이름을 붙여 놓는 것이 좋다?>
나중에 컨테이너를 삭제할때 용이함

root@ubuntu:~# docker rm -f test
컨테이너 삭제 명령어


  • Docker 이미지 태그 변경
root@ubuntu:~# docker image tag httpd:latest web:latest
이미지가 두개인 것처럼 보임 - 이미지 ID 는 동일함


  • 다양한 이미지 검색
root@ubuntu:~# docker search nginx

맨위에 있는 이미지가 Official 한 이미지일 가능성이 높다


  • web 이미지 삭제
root@ubuntu:~# docker image rm web
Untagged: web:latest

<이미지가 너무 많아서 전부 삭제>
root@ubuntu:~# docker image prune 
yes 선택

  • 도커 로그인
    Docker Hub 에 가입하여 user name and pw 설정
    나중에 이미지를 만들어 업로드 가능하다.
root@ubuntu:~# docker login


  • 컨테이너 life Cycle


  • 컨테이너 콘솔로 바로 접속하는 법
root@ubuntu:~# docker run -it --name centos01 centos:7 /bin/bash

아마 이미지 가 없기 때문에 pulling (downlaod)을 할 것이다.
우리가 사용하고 있는 shell 은 bash shell

it 옵션을 사용했기 때문에 컨테이너 ID로 바로 접속을 했음

컨테이너 안에서 명령어를 실행시킬 수 있음

<콘솔에서 빠져나오는 >
Ctrl + pq

root@ubuntu:~# docker rm -f centos01 
centos01
방금 실행시킨 컨테이너를 삭제


2-1 리뷰

nginx 의 최신버전 이미지를 통해 컨테이너를 생성해보자.
단, 컨테이너의 이름은 nginx, 백그라운드 상태여야 한다. 그리고, 해당 컨테이너의 IP 를 통해 동작을 잘 하고 있는 지도 확인 하자


root@ubuntu:~# docker run --name nginx -d nginx:latest
최신 버전의 이미지를 통해 컨테이너를 생성

root@ubuntu:~# docker inspect nginx

root@ubuntu:~# curl 172.17.0.2

root@ubuntu:~# docker inspect nginx | grep IPAddr
IP 만 볼 수 잇음


3. 네트워크 만들기

NAT 의 특성을 갖는 네트워크를 만들 것이고, 서브넷도 정의 할 수 있다.

되도록이면 host 의 대역대와는 겹치지 않게 하는 것이 좋다.
구분이 안될 수도!

root@ubuntu:~# docker network create --driver=bridge 
--subnet=10.10.10.0/24 --gateway=10.10.10.1 my-net

서브넷, GW, 네트워크의 이름 NAT 대역대를 정의 하는 bridge 드라이버 선택


  • my-net 대역대에서 컨테이너 생성 해보기
root@ubuntu:~# docker run -d --name net-test --net my-net httpd
net-test 라는 이름의 컨테이너 생성

root@ubuntu:~# docker inspect net-test | grep IPAddr
IP 까지 확인 하기

<하나  만들어 보기 - 백그라운드가 아닌 콘솔로 접속>

root@ubuntu:~# docker run -it --name net-test2 --net my-net centos:7 /bin/bash
컨테이너 생성과 동시에 콘솔로 접속

[콘솔 접속 상태] ping 10.10.10.2 때려보기
같은 대역대에 있기 때문에 핑이 쳐진다

ctrl + pq 
호스트로 빠져나오기


  • exec : 컨테이너 밖에서 컨테이너 안으로 명령을 넣을 수 도 있다.
    net-test2 라는 컨테이너에 ls 명령을 내려볼 것임
root@ubuntu:~# docker exec net-test2 ls
컨테이너 밖에서 컨테이너 안의 명령어 ls 실행


  • 현재 동작 중인 컨테이너 확인
root@ubuntu:~# docker ps -q

root@ubuntu:~# docker ps -aq


  • 컨테이너 모두 삭제
root@ubuntu:~# docker rm -f $(docker ps -aq)


  • -w 옵션 : 작업하는 공간 (디렉토리) 를 지정할 수 있고,
    -e 옵션 : 환경변수 만들 수 있음
root@ubuntu:~# docker run -it -w=/working -e WORK=/working centos:7
/bin/bash

[root@0fc2910d2739 working]# pwd
/working

  • 현재 디렉토리에 있는 cptest라는 파일을 어떠한 이름(고유)를 갖는 컨테이너의 working directory에 복사하기
root@ubuntu:~# touch cptest.txt
root@ubuntu:~# docker cp ./cptest.txt pensive_bhabha:/working/cptest.txt
root@ubuntu:~# docker exec pensive_bhabha ls/working
root@ubuntu:~# docker exec pensive_bhabha ls /working

<working directory에 있는 cptest.txt파일을 한단계 상위디렉토리에 옮기기
컨테이너와 호스트칸에 복사가 가능하다>

root@ubuntu:~# docker cp pensive_bhabha:/working/cptest.txt ../cptest.txt
root@ubuntu:~# ls /

root@ubuntu:~# docker rm -f root@ubuntu:~# docker rm -f pensive_bhabha

pensive_bhabha컨테이너 지우기


4. 중요한 욥션

  • -p 옵션 : publish

root@ubuntu:~# docker run --name test -p 777:80 -d nginx

크롬 웹브라우저로 접속 호스트 IP 211.183.3.100:777

  • 컨테이너 port 는 중복 가능하다 하지만, 777번 호스트 port 로는 publish 가 불가능 하다 호스트 port 는 중복되면 안된다.

4-1 리뷰

인덱스 파일이 있는 폴더에 접근할 수 있어야 하고, 이름이 kakao 인 httpd 컨테이너를 생성해서 hello 라는 내용의 index.html 파일을 호스트 외부포트 777로 접속했을 때 보여지도록 하시오.

root@ubuntu:~# docker ruun --name kakao -p 7777:80 -d httpd
컨테이너 생성

root@ubuntu:~# docker exec -it kakao /bin/bash
콘솔로 접속

root@b80e23af766d:/usr/local/apache2# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs	modules

root@b80e23af766d:/usr/local/apache2# cd htdocs/
htdocs 디렉토리로 이동

root@b80e23af766d:/usr/local/apache2/htdocs# ls
index.html

기본 index.html 파일 존재

root@b80e23af766d:/usr/local/apache2/htdocs# echo hello
hello

root@b80e23af766d:/usr/local/apache2/htdocs# echo hello > index.html

  • -v 옵션 : 파일을 영구저장 시키고 싶을 때 (덮어쓰기)

root@ubuntu:~# ls
cptest.txt  index.html  snap

root@ubuntu:~# mkdir /vtest

root@ubuntu:~# mv index.html /vtest

root@ubuntu:~# ls /vtest/
index.html

root@ubuntu:~# docker rm -f kakao 
kakao

4-2 리뷰

  1. 이름이 kakao 인 httpd 컨테이너를 생성해서
    hello 라는 내용의 index.html 파일을 호스트 외부 포트 888로 접속했을때 보여지도록 해보자. (이미 index.html 파일에는 hello 가 echo 되어있음)
root@ubuntu:~# docker run --name kakao -dp 888:80 
-v /vtest:/usr/local/apache2/htdocs httpd

root@ubuntu:~# curl localhost:888
hello
  1. kakao2 의 이름을 가진 httpd 컨테이너를 생성해서 외부포트는 8888로 bind 호스트의 /vtest2 와 컨테이너의 /usr/local/apache2/htdoc를 볼륨을 형성하는 컨테이너를 생성해보세요
root@ubuntu:~# mkdir /vtest2
<컨테이너 생성>
root@ubuntu:~# docker run --name kakao2 -dp 8888:80 
-v /vtest2:/usr/local/apache2/htdocs httpd

<index.html 파일 생성>
root@ubuntu:~# docker exec -it kakao2 /bin/bash

root@7f26c7bed004:/usr/local/apache2# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs	modules

root@7f26c7bed004:/usr/local/apache2# cd htdocs/

root@7f26c7bed004:/usr/local/apache2/htdocs# ls    

root@7f26c7bed004:/usr/local/apache2/htdocs# touch index.html

root@7f26c7bed004:/usr/local/apache2/htdocs# echo hello > index.html

root@7f26c7bed004:/usr/local/apache2/htdocs# ls               
index.html

root@7f26c7bed004:/usr/local/apache2/htdocs# cat index.html 
hello


5. Docker Custom 이미지 생성하기

  • Dockerfile 을 작성 해야 한다.

root@ubuntu:~# mkdir /docker
root@ubuntu:~# cd /docker/
root@ubuntu:/docker# vi Dockerfile
root@ubuntu:/docker# 

<빌드 하기>
root@ubuntu:/docker# docker build -t my_nginx:1.0 .
이미 nginx:latest base 이미지가 있으므로 . 만 붙여도 됨


tag 만 붙여준거랑 사실상 동일하다
nginx:latest 랑 IMAGE ID 가 동일함

<아직 layer  변경해준 것이 없기 때문이다!!!>

root@ubuntu:/docker# docker run -d --name my_nginx -p 555:80 my_nginx:1.0
root@ubuntu:/docker# curl localhost:555

6. Custom Image 를 Docker Hub 에 업로드 하기

root@ubuntu:/docker# docker tag my_nginx:1.0 leeeuijoo/my_nginx:1.0

root@ubuntu:/docker# docker image ls

<push>
root@ubuntu:/docker# docker push leeeuijoo/my_nginx:1.0

7. Host 의 Image 파일을 컨테이너에 복사하기

  • 복사 될 곳의 위치 nginx 의 index.html 위치
  • 어떤 디렉토리에서 작업할것 인지!

root@ubuntu:/docker# docker image rm -f my_nginx:1.0 leeeuijoo/my_nginx:1.0 
Untagged: my_nginx:1.0
Untagged: leeeuijoo/my_nginx:1.0
Untagged: leeeuijoo/my_nginx@sha256:6ad8394ad31b269b563566998fd80a8f259
e8decf16e807f8310ecc10c687385

root@ubuntu:/docker# ls
Dockerfile

root@ubuntu:/docker# touch index.html

root@ubuntu:/docker# echo dockerfile > index.html

root@ubuntu:/docker# docker build -t my_nginx:1.1 .

root@ubuntu:/docker# docker rm -f my_nginx 
my_nginx

root@ubuntu:/docker# docker run -dp 999:80 --name my_nginx my_nginx:1.1
profile
무럭무럭 자라볼까

0개의 댓글