vm 보다 용량이 작고 가벼움. 빠른 문제 대처 가능
하드웨어가 바닥 - os - 도커 설치 이다. 원래는. 그 위에 나누어진 컨테이너들. 근데 우리는 이걸 vm상에 한 것임. 실습이기 때문에
-q 리스트를 볼 때 이미지 id만 표시한다. 중요개념
inspect 상세정보를 보여준다.
docker container ls 이렇게 길게 안씀
docker ps로 사용
단축 명령어에 대해 배워봄
[root@localhost ~]# docker ps // 리스트 출력
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker rm -f $(docker ps -a -q)
// -a 모든 컨테이너 실행 중이던 아니던 -q 컨테이너 id 뽑기
// 도커 이미지 출력 명령어
[root@localhost ~]# docker image ls
// 이미지 리스트 확인 단축 명령어
[root@localhost ~]# docker images
// 도커 이미지 지우기, nginx 이미지가 지워짐
[root@localhost ~]# docker image rm nginx
# docker image rm [이미지id] 또는 docker rmi // 컨테이너가 있으면 안지워짐
// :latest 를 붙여주어야함 centos는 리포지토리, 뒤에는 태그 이 둘이 함께 지워져야함
[root@localhost ~]# docker rmi centos:latest
// 여러개 지우기
# docker rmi [] [] ...
// 모든 이미지 지우기
[root@localhost ~]# docker rmi $(docker images -q)
60p 교재 참고
// 컨테이너 임시로 사용. 특정 기능을 잠시만 사용함 리스트 출력하면 프로세스가 꺼져있음
[root@localhost ~]# docker run --name test_cal centos:7 /bin/cal
Unable to find image 'centos:7' locally
7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:c73f515d06b0fa07bb18d8202035e739a494ce760aa73129f60f4bf2bd22b407
Status: Downloaded newer image for centos:7
July 2022
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
// 임시로 쓸건데 리스트에 남아있음. 바로 지우도록 하려면 rm옵션 추가
[root@localhost ~]# docker run --name test_cal1 --rm centos:7 /bin/cal
July 2022
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
// 없어진 것을 확인
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac47147d928a centos:7 "/bin/cal" 2 minutes ago Exited (0) 2 minutes ago test_cal
// 터미널로 들어갈 수 있게 /bin/bash 명령을 실행 -t는 터미널 옵션 -> -i 옵션이 없어서 입력이 안됨 -i 옵션은 표준입력
[root@localhost ~]# docker run -t --name test_bash centos:7 /bin/bash
// -d 옵션을 이용해 ping 이 백그라운드에서 실행되도록 함
[root@localhost ~]# docker run -d --name test_ping centos:7 /bin/ping localhost
// ping 나가는 것 확인
[root@localhost ~]# docker logs -t test_ping
2022-07-11T01:38:31.513949758Z PING localhost (127.0.0.1) 56(84) bytes of data.
2022-07-11T01:38:31.513978666Z 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.030 ms
2022-07-11T01:38:32.524653604Z 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.039 ms
2022-07-11T01:38:33.525427610Z 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.043 ms
2022-07-11T01:38:34.525498544Z 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.117 ms
// 컨테이너 포트 설정 및 실행 명령어
[root@localhost ~]# docker run -d -p 8080:80 --name test_port nginx
// cpu와 메모리의 용량을 지정해주는 명령어
[root@localhost ~]# docker run -d -p 8181:80 --cpus 1 --memory 256m --name test_resource nginx
// 볼륨을 마운트해서 컨테이너 생성
[root@localhost ~]# docker run -d -p 8282:80 --cpus 1 --memory 512m -v /tmp:/usr/share/nginx/html --name volume-container nginx
// 마운트 확인, 어제 했던 작업이 남아있음. 백업이 된 것을 확인
[root@localhost tmp]# ls
index.html
// format을 이용해 보고 싶은 것만 리스트 출력
[root@localhost tmp]# docker ps -a --format "table {{ .Command}}\t{{ .Ports}}"
// 동작중인 컨테이너에 연결
[root@localhost tmp]# docker attach test_bash
// 실행중인 컨테이너에 접속
[root@localhost tmp]# docker exec -it test_bash /bin/bash
[root@14d563db2ba0 /]#
// test_port -> webserver로 컨테이너 이름 변경
[root@localhost tmp]# docker rename test_port webserver
// 컨테이너에 있는 파일 가져오기
[root@localhost ~]# docker cp webserver:/usr/share/nginx/html/index.html /root/index.html
// 컨테이너로 파일 보내기
[root@localhost ~]# docker cp ./index.html webserver:/usr/share/nginx/html/index.html
// 컨테이너 이미지로 만들기
[root@localhost ~]# docker commit -a "wony<test@example.com>" -m "FOOD" webserver test_commit:v1.0
sha256:f73d4a74940f4cb9b8af558d13ad9297d361a1e930de1ecd9d2cd4ae2d1e74f2
// 생성 확인
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test_commit v1.0 f73d4a74940f 18 seconds ago 199MB
nginx latest 55f4b40fe486 2 weeks ago 142MB
centos 7 eeb6ee3f44bd 9 months ago 204MB
// 이미지 저장
[root@localhost ~]# docker save -o test_commit.tar test_commit:v1.0
// test_bash 컨테이너 실행 명령어
[root@localhost ~]# docker exec -it test_bash /bin/bash
// 컨테이너 ip 확인 도구 (컨테이너에 들어가서 설치)
# yum install -y iproute -> ip a로 ip 확인 가능
# yum install -y net-tools -> ifconfig로 ip 확인 가능
컨테이너 속 eth0는 컨테이너의 가상 랜카드
veth1은 링크이다.
docker0은 가상 스위치, 공유기 역할을 하고 있음
// bridge를 가지고 있는게 docker0
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1e362bb6c781 bridge bridge local
91c80ee35f61 host host local
e62007e76105 none null local
// 브리지에 대한 상세내역
[root@localhost ~]# docker inspect bridge
// 도커 네트워크 생성
[root@localhost ~]# docker network create -d bridge --subnet 192.168.123.0/24 --ip-range 192.168.123.128/25 test_bridge
// 생성한 네트워크에 대한 상세내역
[root@localhost ~]# docker inspect test_bridge
// 도커 네트워크 연결
[root@localhost ~]# docker run -d -p 8383:80 --name webserver2 --network test_bridge nginx
// 이미 존재하는 test_bash 컨테이너 생성한 네트워크 대역으로 변경
[root@localhost ~]# docker network connect test_bridge test_bash
// 확인
[root@localhost ~]# docker inspect test_bash
// test_bash 컨테이너에 남아있는 bridge ip 제거
[root@localhost ~]# docker network disconnect bridge test_bash
### 도메인 서비스 !!!!
// 컨테이너에 들어가기
[root@localhost ~]# docker exec -it test_bash /bin/bash
// webserver2컨테이너에 핑 치기. 이름으로 쳤는데 핑나감. 마치 도메인처럼
[root@14d563db2ba0 /]# ping webserver2
PING webserver2 (192.168.123.129) 56(84) bytes of data.
64 bytes from webserver2.test_bridge (192.168.123.129): icmp_seq=1 ttl=64 time=0.052 ms
64 bytes from webserver2.test_bridge (192.168.123.129): icmp_seq=2 ttl=64 time=0.063 ms
// 이거 때문에 도메인처럼 통신 가능
[root@14d563db2ba0 /]# cat /etc/hosts
도커 파일 형식, 스크립트 작업을 해서 필요할 때 배포할 수 있도록 하는 것.
// 도커 파일 생성시 반드지 앞글자 대문자
[root@localhost test]# vi Dockerfile
FROM ubuntu:18.04 #
MAINTAINER wony # 유지보수자 정보 이메일을 넣어도 됨
LABEL "name"="webserver" # 전달사항 누가봐도 웹서버
ENV aloha=date # 환경변수 설정. aloha를 치면 date가 나옴
ENV path=/var/www/html # path변수를 치면 다음과 같은 경로
RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list # 아카이브의 주소를 다음카카오로 바꾸겠다.
RUN apt-get update # RUN은 명령어를 실행할 때 사용
RUN apt-get install apache2 -y
COPY nihao /var/www/html/nihao # 호스트의 파일을 복사
COPY hello.html $path # path로 복사본 넘기기
ADD aws.tar /var/www/html # 같은 경로내에 있는 파일 집어 넣기
-> 이후에 계속~ 하다 말았음
// db서버 컨테이너 생성
# docker run -d -p 3306:3306 --name dbserver \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=wppass \
-e MYSQL_ROOT_PASSWORD=password --network test_bridge mariadb
// apache 컨테이너에 들어가서 웹서버를 설치해주어야함
[root@localhost ~]# docker run -it -d -p 8888:80 --name apache --network test_bridge centos:7
// 워드프레스 설치
# docker exec -it apache bash
yum install -y httpd php php-mysql php-gd php-mbstring wget unzip
wget https://ko.wordpress.org/wordpress-4.8.2-ko_KR.zip
cd /var/www/html
unzip /wordpress-4.8.2-ko_KR.zip
mv wordpress/* .
chown -R apache:apache /var/www
httpd &
// dbserver 핑 나감
[root@2b5ca7c47ed8 html]# ping dbserver
PING dbserver (192.168.123.131) 56(84) bytes of data.
64 bytes from dbserver.test_bridge (192.168.123.131): icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from dbserver.test_bridge (192.168.123.131): icmp_seq=2 ttl=64 time=0.056 ms
// test_commit이랑 똑같은 이미지인데 별칭이 달린 이미지가 생성됨 도커 허브에 전송하기 위해 만듬
[root@localhost ~]# docker tag test_commit:v1.0 sechim052339/test_commit:v1.0
// 도커에 올리기
[root@localhost ~]# docker push sechim052339/test_commit
-> 도커에 로그인 먼저 해주어야함
[root@localhost ~]# docker login
업로드 확인
앞서 도커 허브에 업로드한 컨테이너를 받아서 배포한다
// 우분투에 도커 설치 먼저 진행 후 아래 커맨드 실행
root@ubuntu-node02:~# docker run -d -p 80:80 --name webserver sechim052339/test_commit:v1.0