Docker 와 VM 의 차이
컨테이너 이미지 (Image) : 컨테이너 동작을 위해 필요한 운영체제 , APP
이미지를 실행한 상태가 컨테이너
user1@ubuntu:~$ sudo passwd root
[sudo] password for user1:
New password:
Retype new password:
passwd: password updated successfully
user1@ubuntu:~$ su
Password:
root@ubuntu:/home/user1#
<루트접속 거부 해제>
root@ubuntu:/home/user1# vi /etc/ssh/sshd_config
주석해제 하고 permit 허용 : yes 로 변경
root@ubuntu:~# sudo vi /etc/netplan/00-installer-config.yaml
IP 수정
root@ubuntu:~# netplan apply
변경 적용 명령어
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
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
root@ubuntu:~# docker ps
실행중인 컨테이너 보기
root@ubuntu:~# docker ps -a
모든 컨테이너 보기
root@ubuntu:~# docker rm -f 8084d5d22efb
이름 지정 : --name
백그라운드에서 동작 : -d (detached)
docker hub : Official 한 이미지가 존재하고, 다른 사용자가 개인적으로 만든 이미지가 존재한다.
root@ubuntu:~# docker run --name test -d httpd
test 라는 이름의 컨테이너 생성
root@ubuntu:~# docker ps
root@ubuntu:~# docker network ls
<세가지 네트워크 존재>
host : Bridge 대역대
bridge : NAT 대역대
<네트워크 자세히 살펴보기>
root@ubuntu:~# docker network inspect bridge
* 서브넷에 중점을 두면 된다
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
컨테이너 삭제 명령어
root@ubuntu:~# docker image tag httpd:latest web:latest
이미지가 두개인 것처럼 보임 - 이미지 ID 는 동일함
root@ubuntu:~# docker search nginx
맨위에 있는 이미지가 Official 한 이미지일 가능성이 높다
root@ubuntu:~# docker image rm web
Untagged: web:latest
<이미지가 너무 많아서 전부 삭제>
root@ubuntu:~# docker image prune
yes 선택
root@ubuntu:~# docker login
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
방금 실행시킨 컨테이너를 삭제
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 만 볼 수 잇음
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 드라이버 선택
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
호스트로 빠져나오기
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)
root@ubuntu:~# docker run -it -w=/working -e WORK=/working centos:7
/bin/bash
[root@0fc2910d2739 working]# pwd
/working
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컨테이너 지우기
root@ubuntu:~# docker run --name test -p 777:80 -d nginx
크롬 웹브라우저로 접속 호스트 IP 211.183.3.100:777
인덱스 파일이 있는 폴더에 접근할 수 있어야 하고, 이름이 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
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
root@ubuntu:~# docker run --name kakao -dp 888:80
-v /vtest:/usr/local/apache2/htdocs httpd
root@ubuntu:~# curl localhost:888
hello
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
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
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
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