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
이미지와 컨테이너를 설명하기 전에 우리에게 친숙한 개념을 가져와 설명해보자.
프로그램.exe를 여러 프로세스에서 실행시킬 수 있다.
리눅스 환경에서 생각해보면, /bin 또는 /usr/bin 디렉터리에 있는 바이너리 파일만 배포하고 실행시키는 것이다.
도커 이미지는 실행파일 뿐만 아니라 루트파일시스템(rootfs)을 포함한 격리된 리눅스 환경 자체를 제공한다. 기존의 실행파일만 배포하던 거에 비해 비효율적인 면이 있다고 볼 수도 있다. 예를 들어, mysql컨테이너와 redis컨테이너 그리고 nginx컨테이너가 모두 ubuntu18.04를 사용한다고 했을 때, 중복된 영역이 발생한다. (추후 도커 레이어를 통해 충분히 이러한 문제를 해결할 수 있다. + Copy On Write)
도커 이미지로 인해 생성된 컨테이너들은 독립된 환경을 통해 다양한 버전의 프로그램을 배포할 수 있고, 무엇보다도 프로세스 간 충돌문제에서 자유로워질 수있다는 큰 이점이 있다.
바이너리 파일의 장점은 파일의 용량이 매우 작다는 것이다.
하지만 독립된 루트파일시스템을 컨테이너별로 보장하기 위한 이미지는 상대적으로 용량이 크다.
"mysql"만 배포하고 싶은데, mysql 프로세스가 작동될 독립된 환경까지 함께 배포해야 한다니!
이미지를 정의한 스크립트다.(텍스트 파일)
1) 이미지 자체를 관리하는 것보다 편리하다.
2) 이미지에 어떤 설정이 돼 있는지 알기 쉽다.
-> 리눅스 설정을 소스코드처럼 관리 가능
-> Dockerfile이 없다면, 1년, 5년, 10년이 지나면 리눅스 서버에 어떤 설정이, 어떤 패키지가 적용되어 있는지 아무도 모르게 된다.
독립된 리눅스 환경을 보장받는 건 똑같다.
가상머신의 경우가 오버헤드가 더 크다.
하지만 완벽히 가상머신을 대체할 순 없다.
보안과 네트워크 측면에서 하드웨어와 같은 로우 레벨에서 에뮬레이팅 된 게 아니기 때문에, 어찌됐든 프로세스의 한계다.
완전히 로우 레벨까지 독립이 필요한 게 아니기 때문에 머신 컨테이너를 사용하는 경우는 많이 없다.
보통 앱(애플리케이션) 컨테이너 형태로 많이 운용이 된다.
완벽히 로우 레벨까지 독립을 하려는 머신 컨테이너 영역 또한 있다는 정도 기억.
일단 지금은 맥락만 파악!
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 사용이 가능하다.
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 프로세스가 종료되는 것이 아니다.)