가상머신, 이미지 , 컨테이너

hyuckhoon.ko·2024년 2월 14일
0

도커 설치

reallinux@ubuntu:~$ curl -fsSL https://get.docker.com/ | sudo sh

아래와 같은 에러를 만났다.

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

임의의 명령어 또는 애플리케이션이 시스템을 업데이트할 때, dpkg (Debian Package manager)를 잠근다.
현재 다른 프로세스가 /var/lib/dpkg/lock-frontend 디렉터리의 자원을 사용하고 있다는 에러다.
프로세스를 찾아 전부 제거하거나 lock 관련 디렉터리를 제거하면 된다.

나는 실습용 서버를 사용 중이기에 해당 lock 접두사를 갖는 디렉터리를 모두 제거했다.

sudo rm /var/lib/dpkg/lock*
sudo rm /var/cache/apt/archives/lock

도커 설치 이슈

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

E: Sub-process /usr/bin/dpkg returned an error code (1) 에러 발생

reallinux@ubuntu:~$ uname -r
5.3.0

reallinux@ubuntu:~$ sudo apt install -y linux-image-5.4.0-65-generic
reallinux@ubuntu:~$ sudo reboot

(재접속)

reallinux@ubuntu:~$ uname -r
5.4.0-65-generic

이제 다시 도커 설치

reallinux@ubuntu:~$ curl -fsSL https://get.docker.com/ | sudo sh

슈퍼 유저 권한 없이 도커 사용하기

reallinux@ubuntu:~$ sudo usermod -aG docker reallinux
reallinux@ubuntu:~$ exit
logout
Connection to localhost closed.
$ ssh -p 2222 reallinux@localhost

이렇게 하면 ssh로 재접속하더라도 설정이 유지된다.

도커 설치 확인하기

reallinux@ubuntu:~$ docker -v
Docker version 24.0.2, build cb74dfc

reallinux@ubuntu:~$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

도커 컨테이너 생성하고 컨테이너 내부 들어가기 🐳

reallinux@ubuntu:~$ docker run --rm -it ubuntu:16.04 /bin/bash

실행된 컨테이너의 우분투 배포판은 뭘까?

root@4813bf8f48a7:/# cat /etc/issue
Ubuntu 16.04.7 LTS \n \l

그렇다면 도커 컨테이너 말고 기존 리눅스 환경의 우분투 배포판은 무엇일까?

reallinux@ubuntu:~$ cat /etc/issue
Ubuntu 18.04.3 LTS \n \l

호스트 리눅스 OS 버전과 컨테이너 OS 버전이 다르다.
즉, 다수의 컨테이너 실행 시, 서로 다른 버전의 리눅스 OS를 설정할 수 있음을 시사한다.

실행중인 컨테이너 확인하기

새로운 터미널을 열고, 호스트에 접속한다.

ssh -p 2222 reallinux@localhost

컨테이너 확인

reallinux@ubuntu:~$ docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS     NAMES
4813bf8f48a7   ubuntu:16.04   "/bin/bash"   4 minutes ago   Up 4 minutes             dreamy_dewdney

다른 명령어로도 확인이 가능하다.

reallinux@ubuntu:~$ docker container list
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS     NAMES
4813bf8f48a7   ubuntu:16.04   "/bin/bash"   6 minutes ago   Up 6 minutes             dreamy_dewdney

이미지 vs 컨테이너

서론

이미지와 컨테이너를 설명하기 전에 우리에게 친숙한 개념을 가져와 설명해보자.

프로그램.exe를 여러 프로세스에서 실행시킬 수 있다.
리눅스 환경에서 생각해보면, /bin 또는 /usr/bin 디렉터리에 있는 바이너리 파일만 배포하고 실행시키는 것이다.

도커 이미지는 실행파일 뿐만 아니라 루트파일시스템(rootfs)을 포함한 격리된 리눅스 환경 자체를 제공한다. 기존의 실행파일만 배포하던 거에 비해 비효율적인 면이 있다고 볼 수도 있다. 예를 들어, mysql컨테이너와 redis컨테이너 그리고 nginx컨테이너가 모두 ubuntu18.04를 사용한다고 했을 때, 중복된 영역이 발생한다. (추후 도커 레이어를 통해 충분히 이러한 문제를 해결할 수 있다. + Copy On Write)

도커 이미지로 인해 생성된 컨테이너들은 독립된 환경을 통해 다양한 버전의 프로그램을 배포할 수 있고, 무엇보다도 프로세스 간 충돌문제에서 자유로워질 수있다는 큰 이점이 있다.

바이너리 파일의 장점은 파일의 용량이 매우 작다는 것이다.
하지만 독립된 루트파일시스템을 컨테이너별로 보장하기 위한 이미지는 상대적으로 용량이 크다.
"mysql"만 배포하고 싶은데, mysql 프로세스가 작동될 독립된 환경까지 함께 배포해야 한다니!

Dockerfile

이미지를 정의한 스크립트다.(텍스트 파일)
1) 이미지 자체를 관리하는 것보다 편리하다.
2) 이미지에 어떤 설정이 돼 있는지 알기 쉽다.
-> 리눅스 설정을 소스코드처럼 관리 가능
-> Dockerfile이 없다면, 1년, 5년, 10년이 지나면 리눅스 서버에 어떤 설정이, 어떤 패키지가 적용되어 있는지 아무도 모르게 된다.

가상머신 vs 컨테이너

독립된 리눅스 환경을 보장받는 건 똑같다.
가상머신의 경우가 오버헤드가 더 크다.
하지만 완벽히 가상머신을 대체할 순 없다.
보안과 네트워크 측면에서 하드웨어와 같은 로우 레벨에서 에뮬레이팅 된 게 아니기 때문에, 어찌됐든 프로세스의 한계다.

완전히 로우 레벨까지 독립이 필요한 게 아니기 때문에 머신 컨테이너를 사용하는 경우는 많이 없다.
보통 앱(애플리케이션) 컨테이너 형태로 많이 운용이 된다.

완벽히 로우 레벨까지 독립을 하려는 머신 컨테이너 영역 또한 있다는 정도 기억.

일단 지금은 맥락만 파악!

mysql 컨테이터 다운 및 실행

mysql 프로세스를 위한 namespace, cgroup적용되어 격리(독립)된 프로세스 실행

reallinux@ubuntu:~$ docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7

mysql 프로세스가 구동되는 걸 확인하자.

reallinux@ubuntu:~$ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
3db0afaae0b9   mysql:5.7   "docker-entrypoint.s…"   23 seconds ago   Up 21 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql

단지 하나의 프로세스일 뿐이다!.

reallinux@ubuntu:~$ ps -ef |  grep mysql
999       2262  2238  0 13:41 ?        00:00:00 mysqld

앞에선 /bin/bash 라는 반응형 프로그램을 실행했기에 상호작용하는 모습을 확인할 수 있었다.
지금은 명령어 반응형 프로그램이 아닌 mysql이 실행된 것이다.

그렇다면 mysql 컨테이너를 들여다 보는 방법은 없을까?

mysql 프로세스의 자식 프로세스를 생성하면 된다.!

docker exec 를 통해 자식 프로세스에서 /bin/bash를 실행하면 된다.

reallinux@ubuntu:~$ docker ps 
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
3db0afaae0b9   mysql:5.7   "docker-entrypoint.s…"   4 minutes ago   Up 4 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql
reallinux@ubuntu:~$ docker exec -it 3db0afaae0b9 /bin/bash

mysql 의 자식 프로세스에서 PID를 확인해보자.

bash-4.2# cat /proc/1/comm
mysqld

proc의 하위 디렉터리 및 파일들은 특수 디렉터리/파일이며, 커널 메모리에 연결되어 있으며 프로세스 정보를 볼 수있다.

/bin/bash 의 PID도 확인해보자.

proc/ 까지 입력 후 tab을 입력하면, 212/ 가 나온다.

bash-4.2# cat /proc/  
1/                 crypto             interrupts         kpagecgroup        mounts             self/              timer_list
212/               devices            iomem              kpagecount         mtrr               slabinfo           tty/
acpi/              diskstats          ioports            kpageflags         net/               softirqs           uptime
buddyinfo          dma                irq/               loadavg            pagetypeinfo       stat               version
bus/               driver/            kallsyms           locks              partitions         swaps              version_signature
cgroups            execdomains        kcore              mdstat             pressure/          sys/               vmallocinfo
cmdline            fb                 key-users          meminfo            sched_debug        sysrq-trigger      vmstat
consoles           filesystems        keys               misc               schedstat          sysvipc/           zoneinfo
cpuinfo            fs/                kmsg               modules            scsi/              thread-self/       
bash-4.2# cat /proc/212/comm
bash

mysql 접속하기

클라이언트까지 설치하면 mysql 사용이 가능하다.

reallinux@ubuntu:~$ mysql -h127.0.0.1 -uroot
                                
Command 'mysql' not found, but can be installed with:

sudo apt install mysql-client-core-5.7   
sudo apt install mariadb-client-core-10.1

reallinux@ubuntu:~$ mysql -h127.0.0.1 -uroot
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

MySQL [(none)]> 

자식 프로세스 종료

exit를 입력하면 자식 프로세스가 종료된다.
(mysql 프로세스가 종료되는 것이 아니다.)

0개의 댓글