C: Container
- Docker 이미지
비활성 상태
완전조리식품? 냉동식품
- Docker 컨테이너
create: 컨테이너가 만들어졌으나 활성화 x
start: 이 컨테이너를 구동하게 함 = 활성화
run : create + run
도커 이미지를 한번 쓰고 버리지 않고 복사해서 계속해서 재사용한다.
활성 상태: 네트워크 자원을 일정 부분을 쓰겠다고 프로세스를 점유한 상태
구동되다(실행) : 스냅샷이 프로세스(PS)로 올라가서 실행이 된 상태. 이 때, 웹페이지로 접속이 가능하다.
docker search
docker image pull
ex. docker image pull nginx
이미지를 갖고 온다.
만약 동일한 이미지를 갖고 있다면 갖고오지 않는다
docker image ls
이미지를 리스트로 본다.
docker image inspect
- 이미지에 대한 자세한 정보 표시
- 이미지는 1개 이상
- 이미지 뿐만 아니라 컨테이너, 볼륨, 네트워크 등에도 쓰인다.
ex. docker image inspect --format="{{.OS}}" nginx
docker container run
- 컨테이너 생성 및 시작
- it : 컨테이너 생성과 동시에 접속할 수 있다.
docker container run --cpu 1 --memory=256m --name test_resource nginx
- 상세 설정, 만약 설정하지 않으면 최대값으로 설정되며 자원이 최대값을 넘을 수 없다.
docker container run -d -p 8282:80 -v --cpu 1 --memory=256m -v /tmp:usr/var/www/html
- 포트 번호는 각 도커 호스트: 컨테이너
- -v: bind mount, 경로를 공유한다. 각각 도커 호스트의 경로 : 컨테이너의 경로
docker container stats
- CPU, RAM SSD, NET의 사용량 측정
docker container ls -a -f name=test_
test_가 포함된 컨테이너를 볼 수 있다
docker container ls -a -f exited=0
멈춰진 컨테이너를 볼 수 있다
docker container ls -a --format "table{{.Names}}\t{{.Status}}"
도커 명령어 간소화하기
docker container ls == docker ps
docker container rm == docker rm -f $(docker ps -a -q)
docker image rm 이름/아이디 == docker rmi repository 이름:태그(latest 등)
docker rmi 아이디 아이디2 아이디3 … // 여러개의 이미지 지울 수 있다
docker image ls == docker images
docker rmi $(docker images -q) // 모든 image를 지운다. docker images -q : 모든 이미지를 보여줌
[root@localhost ~]# docker run --name test_cal centos:7 /bin/cal
가장 최신버전의 centos를 다운로드받는다.(centos:7 이러면 7버전 다운로드)
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
한번 실행하고 멈추기 때문에 docker ps하면 아무것도 안나옴
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0153f6346f67 centos:7 "/bin/cal" About a minute ago Exited (0) About a minute ago test_cal
-a를 하면 보임
[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
0153f6346f67 centos:7 "/bin/cal" 2 minutes ago Exited (0) 2 minutes ago test_cal
임시로 컨테이너 사용, 사용 후 삭제하는 과정을 간소화하기 위해 –rm 사용하였다
삭제되었기 때문에 -a를 통해 리스트해도 보이지 않는다.
-it
-i : 표준 입력(stdin), 이 옵션이 없으면 접속해도 입력이 되지 않는다.
[root@localhost ~]# docker run -d --name test_ping centos:7 /bin/ping localhost
자기 자신(localhost)에게 ping을 친다.
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e843bf5b9f4 centos:7 "/bin/ping localhost" 8 seconds ago Up 7 seconds test_ping
백그라운드 실행되고 있는 ping의 진행 상황을 보기 위해 logs를 이용한다.
실시간으로 보는 것은 아님
docker [container] run -d -p 8080:80 --name test_port nginx
컨테이너 접속 포트 설정 = 포트포워딩
- 8080: host port, 80:container port
- nginx: 이미지
/docker-entrypoing nginx가 실행되고 있는 커멘드, 8080으로 접근하면 볼 수 있을 것이라는 의미
접속해본다.
Command와 Port가 테이블로 나타난다.
-f는 이미 filter로써 이미 사용되고 있으므로, --format으로 옵션을 줘야 한다.
test_bash가 있는지 확인한다.
그냥 exit치고 나오면 bash가 멈춘다.
-> 왜냐하면 /bin/bash가 이미 실행 중에 있기 때문에 이를 활용해서 container에 들어가는 것. 그런데 exit를 하면 커멘드가 지워진다.
따라서 exit 대신 ctrl + p, ctrl + q를 입력해야 해서 빠져나와야 한다.
docker [container] exec -it test_bash /bin/bash
- 동작 중인 컨테이너에서 프로세스 실행
rename : 컨테이너 이름을 변경한다.
8080 포트로 접속
폴더 통으로 옮기기(overwrite)
food.tar파일을 moba Xterm으로 옮긴다.
docker container commit
컨테이너를 이미지로 만들기
test_commit.tar가 생긴다.
Network Architecture of Docker
eth0 : 컨테이너의 가상 랜카드
veth1 : 링크, 일종의 인터페이스
docker0 : 가상의 스위치, 공유기의 역할을 한다. - 포트포워딩을 해 준다.
etho0 : 실제 LAN카드
veth~~ @if41 : @뒤 id는 가상의 인터페이스 이름?
veth는 현재 5개의 컨테이너가 Up되어있는 상태이기 때문에, veth또한 5개 연결되어있음을 볼 수 있다.
test_bash로 들어가 본다.
ip 명령어가 없다.
yum install -y net-tools
yum install -y iproute
검증을 위해 install 할 뿐이고 실제로는 용량을 위해 다운로드 하지 않는다.
veth7e09a62@if4
vetha278b52@if6
vethf80a354@if8
veth937573c@if10
vethfe66611@if12
각각 콜론 기준으로 왼쪽이 상대방(도커 호스트 or 컨테이너), 오른쪽이 자신의 정보이다.
왼쪽의 12번 : 12번이 컨테이너 바깥의 docker0의 인터페이스 이름.
eth0@if13 : 가상 스위치의 포트 번호
bridge: docker0의 이름
bridge에 대해 inspect 해 보면 docker0임을 알 수 있다.
네트워크를 만든다.
-d: 드라이버
1~ 127까지, 129~255까지 사용하는 네트워크 영역 두 개로 만든다. (128번은 GW로 사용됨)
연결된 컨테이너들이 없으므로 inspect 해도 보이지 않는다.
Docker 네트워크 연결
docker container run -d -p 8080:80 --name webserver1 --network test_bridge nginx
inspect 해서 ip를 보면 129번이다.
이게 게이트웨이이다.
test_bash에 test_bridge를 연결하면
inspect를 하였을때 test_bridge가 추가된 것을 볼 수 있다.
disconnect하기
도메인 네임 서비스
docker exec -it test_bash /bin/bash
webserver1은 컨테이너인데, 마치 도메인처럼 취급되었다. - IP를 대체하여 통신이 된다
- container의 아이피는 바뀔 수 있지만, 컨테이너의 이름은 바뀌지 않는다. -> webserver와 dbserver간에 컨테이너 이름으로 통신하면 된다.
Wordpress 구축하기
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 mariadb
ps해보면 dbserver가 생성되어 있다.
centos에 apache를 까는 것처럼 centos를 os로써 설치한다.
백그라운드 실행을 통해 8888번 포트 오픈, 웹에서 접속할 수 있도록 한다.
그러면 apache라는 이름의 컨테이너가 생성된다.
network는 test_bridge로 설정한다.
docker exec -it apache bash
방금 만든 apache 컨테이너에 접속한다.
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
chown -R apache:apache wordpress
httpd &
- 혹은 chown -R apache:apache /var/www 를 해도 된다.
- *systemctl은 docker container에서 정상적으로 작동되지 않는다.
- &: 백그라운드 실행
한번 더 엔터 쳐야 한다.
그리고 dbserver로 ping을 쳐보면 가지 않는다.
dbserver의 네트워크가 test_bridge로 연결되지 않아서 생기는 문제이다.
docker network connect test_bridge dbserver
연결해주고 다시 ping을 쳐 본다.
http://192.168.0.222:8888/
로 접속해 본다.
설정을 완료한다.
Tag
*test_commit만 치고 tap을 치면 v1.0이 뜬다.
후 images를 해 보면 test_commit v1.0, test_commi 두 개의 repo가 생긴다.
하지만 두개의 id를 확인해 보면 동일하다. -> tag를 단 이미지가 alias가 된다.
-> 도커 허브의 내 계정에 전송하기 위해, 주소로써 사용한다.
* 우측과 같이, 처음 커밋을 할 때 도커 허브의 id를 붙이면 tag를 할 필요가 없다.
docker push를 하기 전에, 로그인한다.
한번 로그인하면, 직접 로그아웃하기 전까지는 그대로 로그인 상태를 유지한다.
push 한다.
Docker Hub Container Image Library | App Containerization
We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy
hub.docker.com
그러고 dockerhub에서 repository를 들어가보면 방금 commit한게 올라와 있음을 확인할 수 있다.
Ubuntu 에 도커 설치 후 커밋 배포하기
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
$ sudo apt update
$ sudo apt-cache policy docker-ce
$ sudo apt install docker-ce -y
그러면 docker hub에 있는 주소의 이미지를 다운로드받게 된다.
그리고 ubuntu의 ip주소로 들어가 본다.
Docker Build 하기
- image build를 위해서는 docker file이 있어야 한다.
*Docker file
- 컨테이너를 생성하는 여러 구성 정보를 하나의 파일로 정리하고 일괄 실행하여 docker image build 명령을 통해 docker 이미지를 작성하는 스크립트 => IaC의 일종이다.
- 일일이 명령어를 실행하지 않고, 작업과정을 하나의 파일로 만들어 자동화하였다.
Docker File의 Command
mkdir test && $_
vi Dockerfile
- test 디렉터리를 만든 뒤 작업한다. - 도커 파일을 만들 때는 보통 디렉터리 단위로 관리한다.
- Dockerfile의 D는 반드시 대문자여야 한다. 나머지는 소문자이다.
FROM ubuntu:18.04
# 베이스 이미지가 ubuntu -> 우분투의 명령어를 사용할 것이라는 의미
MAINTAINER johnlee
# 관리자의 이름
LABEL "name"="webserver"
# 레이블은 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
# 바꿀 내용 -> 찾을 내용, daumkakao 사이트에서 더 빠르게 작업할 수 있다.
RUN apt-get update
RUN apt-get install apache2 -y
COPY nihao /var/www/html/nihao
COPY hello.html $path
# path 경로에 hello파일을 복사한다.
ADD aws.tar /var/www/html
#타르 파일이 html 경로에 압축 해제된다.
WORKDIR /var/www/html
RUN echo ohayo >> ohayo.html
VOLUME /var/www/html
EXPOSE 80
ENTRYPOINT ["apachectl"]
CMD ["-D", "FOREGROUND"]
이 기재정보들은 inspect에서 볼 수 있다.