Docker로 Ubuntu 사용해보기

Woody의 기록·2023년 7월 24일
2

Linux

목록 보기
3/4

Docker로 Ubuntu Container 만들고 실행하기

✓ 우분투 이미지 Pull

$ docker pull ubuntu

✓ 설치된 이미지 확인

$ docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS                       PORTS                                                                              NAMES
824f84264a66   ubuntu                     "/bin/bash"              24 minutes ago   Exited (127) 5 seconds ago

✓ 우분투 컨테이너 생성

  • 직관적으로 사용하기 쉽게 컨테이너명은 ubuntu로 설정했다.
$ docker create -it --name ubuntu ubuntu

✓ 컨테이너 실행

$ docker start ubuntu

✓ 우분투 컨테이너 접속

  • $ docker attach 컨테이너명 으로 실행중인 컨테이너 쉘에 접근할 수 있다. attach 명령어는 실행중인 컨테이너에 터미널을 붙이는 기능을 수행한다.
  • 실행중인 컨테이너에 터미널을 붙이기 위해서는 컨테이너 생성(create)시에 -it 옵션을 주어서 생성하여아한다.

-it 옵션

  1. i 옵션: stdin(표준 입력)을 활성화한다. 이 옵션을 사용하지 않으면 컨테이너로 입력을 보낼 수 없다.
  2. t 옵션: TTY(TeleTYpewriter) 모드를 사용하도록 하는 옵션이다. 이 옵션을 사용하지 않으면 컨테이너와 상호작용하기 위한 의사 터미널이 생성되지 않아서 터미널을 사용할 수 없다.
$ docker attach ubuntu
root@824f84264a66:/#

터미널이 정상적으로 unbuntu 컨테이너에 붙은 것을 확인할 수 있다.

이제부터는 실제 우분투 쉘을 사용하던 것과 동일하게 사용하면 된다.

터미널을 종료하고 싶으면 터미널에 exit을 입력하여 빠져나올 수 있다. exit 명령어를 사용한 경우 도커 컨테이너도 같이 종료된다.

만약 컨테이너를 종료시키지 않고 내부 터미널을 빠져나오고 싶다면 ctrl+pctrl+q 를 순차적으로 눌러서 빠져나올 수 있다.

  • exit으로 빠져나온 경우
root@824f84264a66:/# exit
exit

$ docker ps -a                                                                                                                                                               
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS                      PORTS                                                                              NAMES
824f84264a66   ubuntu                     "/bin/bash"              53 minutes ago   Exited (0) 3 seconds ago                                                                                       ubuntu

exit으로 빠져나온 후 docker ps -a로 컨테이너 STATUS를 확인해보면 Exited 상태인 것을 확인할 수 있다.

  • ctrl+pctrl+q 키 조합으로 빠져나온 경우
root@824f84264a66:/# read escape sequence

$ docker ps -a
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS                      PORTS                                                                              NAMES
824f84264a66   ubuntu                     "/bin/bash"              55 minutes ago   Up 19 seconds

컨테이너 내부 터미널에서 ctrl+pctrl+q 를 순차적으로 누르면 read escape sequence라는 문구가 터미널 명령창에 출력되면서 내부 터미널을 빠져나오게 된다.

docker ps -a로 확인해보면 STATUS 가 여전히 Up인 것을 볼 수 있으며, 컨테이너는 종료되지 않고 빠져나왔음을 확인할 수 있다.

간단하게 우분투 초기 설정해보기

✓ root 비밀번호 설정

초기 우분투 컨테이너를 생성하고 실행하면 root로 실행되는데 이때 비밀번호를 초기화 해주어야 한다.
passwd 명령어로 간단히 초기화 가능하다.

root@824f84264a66:/# passwd
New password:
Retype new password:
passwd: password updated successfully

✓ Package Manager 업데이트

초기 우분투 설치 시 기본적으로 제공되는 패키지 관리자인 apt를 사용하면, 우분투의 패키지들은 최신 버전이 아닐 수도 있다. 이는 설치한 우분투 이미지가 릴리즈된 시점을 기준으로 패키지들이 포함되기 때문이다.

따라서 최초 설치 시 apt나 apt-get 등의 패키지 관리자를 업데이트 해주는 것이 좋다.

업데이트는 apt의 경우 $ apt update 로, apt-get의 경우$ apt-get update 로 수행할 수 있다.

apt update vs apt upgrade

apt update:
apt를 업데이트한다는 것은 패키지 리스트를 최신으로 업데이트 하는 것을 의미한다.
패키지 리스트은 패키지 관리자가 패키지를 검색하고 다운로드할 수 있는 공식적인 정보 저장소이다. 즉, 실제 패키지를 최신버전으로 업데이트하는 것이 아니라 /etc/apt/sourcelist, /etc/apt/sourcelist.d/*와 같은 패키지 리스트 최신 업데이트 하는 것을 의미한다.

apt upgrade:
현재 시스템에 설치된 패키지들을 최신 버전으로 업데이트하는 명령어는 apt upgrade이다.
apt upgrade를 통해서 현재 시스템에 설치되어있는 패키지들을 최신버전으로 업데이트할 수도 있다.

  • apt update 예시
root@824f84264a66:/# apt update
Hit:1 http://ports.ubuntu.com/ubuntu-ports jammy InRelease
Get:2 http://ports.ubuntu.com/ubuntu-ports jammy-updates InRelease [119 kB]
Get:3 http://ports.ubuntu.com/ubuntu-ports jammy-backports InRelease [108 kB]
Get:4 http://ports.ubuntu.com/ubuntu-ports jammy-security InRelease [110 kB]
Fetched 337 kB in 3s (125 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.

이미 최신상태로 업데이트 해두었기 때문에 All packages are up to date 라고 출력되고 있다.

  • apt upgrade 예시
root@824f84264a66:/# apt upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

설치되어 있는 패키지들도 모두 최신 버전인 것을 알 수 있다.

→ 비슷한 방식으로 apt-get의 경우 apt-get update 명령어를 통해 업데이트 할 수 있다.

✓ 우분투에 user 추가해보기

root가 아닌 일반 사용자를 추가해보자. 사용자 추가는 useradd 명령어를 통해 수행한다.

root@824f84264a66:/# adduser woody
Adding user 'woody' ...
Adding new group `woody' (1001) ...
Adding new user `woody' (1001) with group `woody' ...
Creating home directory `/home/woody' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for woody
Enter the new value, or press ENTER for the default
	Full Name []:
	Room Number []:
	Work Phone []:
	Home Phone []:
	Other []:
Is the information correct? [Y/n]

✓ 생성한 사용자로 로그인해보기

계정 전환은 su(switch user) 명령어를 통해 가능하다.

su로 전환하는 방식은 두가지가 있다.

  1. $ su 사용자명
  2. $ su - 사용자명
  • 두 가지 경우 모두에 대해서 사용자명을 생략하면 root 계정으로 전환된다. 모든 계정 전환에는 해당 계정의 비밀번호가 요구된다.

$ su 사용자명으로 전환할 경우 계정은 전환되지만 환경변수나 디렉토리는 전환되지 않고 유지된다. 이로 인해 대상 사용자의 환경 설정과 프로파일이 적용되지 않을 수 있다.

계정 전환과 동시에 해당 계정의 환경변수와 홈디렉토리로 전환하기 위해서는 $ su - 사용자명을 사용하면된다. $ su - 사용자명는 은 대상 사용자로 전환되면서, 대상 사용자의 환경 변수와 작업 디렉토리로 전환하는 명령어로, 이를 통해 대상 사용자로 전환된 후에도 원하는 환경 설정과 프로파일이 적용되게된다.

$ su 사용자명 명령어로 woody 라는 이름의 사용자로 전환

root@824f84264a66:~# pwd
/root
root@824f84264a66:~# su woody
woody@824f84264a66:/root$ pwd
/root
woody@824f84264a66:/root$

woody 계정으로 전환되었지만 디렉터리는 전환되지 않고 여전히 root의 홈디렉터리에 있는 것을 확인할 수 있다.

$ su - 사용자명 명령어로 woody라는 이름의 사용자로 전환

root@824f84264a66:~# pwd
/root
root@824f84264a66:~# su - woody
woody@824f84264a66:~$ pwd
/home/woody
woody@824f84264a66:~$

woody로 전환되고 pwd 또한 woody의 홈 디렉터리인 /home/woody로 변경된 것을 볼 수 있다.

사실 굳이 pwd로 찍어보지 않아도 ~가 출력되는 것을 보고 woody가 자신의 home directory에 위치한 것을 인지할 수 있지만 직관성을 높이기 위해서 pwd로 출력해보았다.

✓ 사용자를 sudoers에 추가하기

사용자가 sudo 명령어를 사용해야 하는 경우, sudo 명령어를 사용할 수 있도록 자격을 부여해야하는데
우분투에 경우 /etc/sudoers에 사용자를 직접 추가해주어서 특정 사용자가 sudo 명령어를 사용할 수 있게 설정할 수 있다. CentOS 의 경우 wheel 그룹에 추가해주어야 하는 등 배포판마다 차이가 있다.

apt를 통해서 vim 과 같은 에디터를 설치한 후 /etc/sudoers를 수정해준다. /etc/sudoers를 수정하기 위해서 root 권한이 필요하므로 root로 계정전환 후 수행하였다.

root 계정으로 전환 후 vim 에디터로 /etc/sudoers 열기

woody@824f84264a66:/root$ su -
root@824f84264a66:~# vim /etc/sudoers
  • 당연한 이야기지만 이미 root 계정인 경우 전환할 필요가 없다.
  • vim이 설치되어 있지 않은 경우 apt install vim 을 통해 vim을 설치해준다.

sudo 명령어를 사용할 수 있는 사용자에 woody 추가

vim으로 /etc/sudoers 를 열어서 다음과 같은 내용이 있는 부분을 찾는다.

# Allow members of group sudo to execute any command

%sudo ALL=(ALL:ALL) ALL

해당 위치의 마지막줄에 아래와 같이 woody ALL=(ALL:ALL) ALL 를 추가해준 후 wq! 명령어로 저장하고 vim 에디터를 빠져나온다.

...(생략)...

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
woody   ALL=(ALL:ALL) ALL

...(생략)...

"/etc/sudoers" [readonly] 55L, 1695B                                                                                                                                                          55,1          Bot

sudoers에 woody를 추가하고나면 woody에서 sudo 명령어를 사용할 수 있다.

  • 만약 sudo 명령어가 없다고 오류 메시지가 출력되는 경우apt install sudo 를 통해 sudo 패키지를 설치해준다.

✓ sudo 사용해보기

woody 계정은 root의 홈디렉터리인 /root의 내용을 볼 수 없다. 하지만 sudo를 통해 일시적으로 root 권한을 획득하여 명령어를 수행할 수 있는 방법이 있는데, 해당 명령어가 바로 sudo 명령어이다.

woody가 /root 경로에서 ls 명령어를 통해 해당 디렉터리를 확인하고자 하면 Permission denied가 출력되게 된다.

root@824f84264a66:~# su woody
woody@824f84264a66:/root$ ls
ls: cannot open directory '.': Permission denied

sudo를 통해 명령어를 실행하면 woody 계정을 사용하는 상황에서도 root 권한 잠깐동안 획득하여 특정 명령어를 수행할 수 있다.

sudo를 사용하여 root 권한으로 ls 명령어 수행

woody@824f84264a66:/root$ sudo ls
[sudo] password for woody:
root_dir.txt

방금 Permission denied 된 상황을 sudo ls 통해 root 권한으로 ls를 실행하면 woody 계정에서 /root 를 확인할 수 있게된다.

기존에는 Permission denied가 발생했지만 sudo를 통해 root 권한으로 ls를 실행하였기 때문에 /root 디렉터리에 사전에 미리 만들어둔 테스트용 파일인 root_dir.txt가 출력되는 것을 확인해 볼 수 있다. 이렇게 사용자를 sudoers에 추가하여 sudo 명령어를 사용하게 할 수 있다.
sudo는 윈도우 운영체제에서의 관리자 권한으로 실행 정도로 생각하면 편할 것 같다.


이렇게 도커를 통해 m1 mac 환경에서 ubuntu 이미지 pull 및 컨테이너를 생성하고, 컨테이너에 터미널을 attach 하여 우분투 내부 터미널로 접속해보았다. 또한 정상작동을 확인하기 위해 간단하게나마 우분투 초기 설정들을 해보았다.

profile
Github - https://www.github.com/woody35545

2개의 댓글

comment-user-thumbnail
2023년 7월 24일

개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.

1개의 답글