기타

docker로 ubuntu 환경 셋업

Sila 2023. 4. 1. 13:14

처음 프로그래밍을 배우기 시작할 때 윈도우 os에 ubuntu를 설치하고,

 

여기서 vim이나 mysql 등 필요한 것들을 설치해 사용헀다.

 

그런데 어느 순간 속도가 눈에 띄게 느려지더라. 리액트 서버 한 번을 키는데 몇 분이 걸리지를 않나..

 

그래서 혼자 공부를 할 때는 수업 듣던 도중에 산 맥북을 이용해왔는데

 

 

최근에 맥북에서 mysql workbench를 이용해 eer을 통해

 

db schema를 만들 때 생각한 table간 관계가 내 의도대로 구현이 됬는지를 보려고 하니

 

window에선 툴바가 보이는데, mac에선 이상하게 그 기능을 찾을 수가 없더라.

 

그래서 다시 윈도우로 작업물을 가져와야 할 일이 생겼는데,

 

이 기회에 개발환경을 좀 정리해두는게 좋을 것 같았고, (선택지는 많을수록 좋으니까..)

 

직접 윈도우에 우분투를 다시 설치하기보다 docker를 이용해 약간 옮기거나 수정하기 편한 환경을 셋업해보기로 했다.

 

1. docker desktop 설치

docker에서 지원하는 데스크탑 어플리케이션을 사용했다. cli 줄줄 쓰는거 버튼 한 번 딸깍하면 되서 편하더라.

 

https://www.docker.com/products/docker-desktop/

 

Download Docker Desktop | Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

 

 

2. 이미지 다운로드

cli는 wsl이 아닌 윈도우 터미널에서 진행한다.

 

다운받을 우분투 이미지를 cli에서 검색하면 이런저런 이미지가 쭉 나오는데 그 중 순정 우분투를 설치했다.

docker search ubuntu

 

가장 위에 있는 스타 많이 받고, 우분투에서 공식으로 배포한 이미지를 사용했다.

docker pull [option] [경로]<이미지명>[:태그명]

위와 같은 신텍스를 사용하는데, 자세한 건 공식 홈페이지 개발자 문서를 참고하면 되고,

 

(https://docs.docker.com/engine/reference/commandline/pull/)

 

난 그냥 아래처럼 디폴트 값을 알아서 가져오도록 받을 이미지 이름만 입력했다.

docker pull ubuntu

 

잘 받아졌는지 확인하려면 다음과 같은 명령어를 입력하면 가지고 있는 이미지 리스트를 보여준다.

docker images

 

ubuntu가 있으면 된다.

 

데스크톱 어플리케이션에서는 다음과 같이 보인다.

 

 

3. 컨테이너 생성

이제 받은 이미지를 가지고 컨테이너를 만든다.

docker create [flags] --name [컨테이너명] [이미지]

다음 신텍스를 사용해 이미지로부터 컨테이너를 만들어내는데, 

docker create -it --name init ubnutu

docker에서 돌아가는 ubuntu가 나와 상호작용 (stdin, stdout) 하길 원하므로 그에 관련된 flag i, t를 옵션으로 집어넣었고,

 

이름은 init으로 설정했으며, ubuntu 이미지를 사용했다.

 

컨테이너 create 시점에서의 flag에 대한 자세한 정보는 공식 홈페이지 개발자 문서를 참조하면 된다.

 

(https://docs.docker.com/engine/reference/commandline/create/)

 

 

컨테이너의 status를 확인하고 싶다면 다음과 같이 입력해준다.

docker ps -a

 

상태를 확인했다면 이제 컨테이너에 접속해보자. attach와 함께 접속할 컨테이너 이름을 입력하면 된다.

docker attach init

 

우분투 환경으로 바뀐다면 성공이다.

 

이걸 모든 과정을 한 번에 하고 싶다면 run 명령어를 사용한다.

 

docker run -it --name init ubuntu

이러면 한 번에 attach까지 다 됨.

 

 

4. vs code 상호작용하기

이제 vs code를 사용해 docker의 ubuntu 컨테이너와 상호작용할 수 있다면 끝이다.

 

vs code의 플러그인을 사용하면 금방이다.

 

 

vs code의 플러그 인 탭으로 가서 마이크로소프트에서 배포한 Remote Development를 설치한다.

 

extension pack이라고 된 4개의 플러그인도 받아놓자.

 

그러고 나면 좌측 툴바에 다음과 같이 Remote explorer가 추가될 것이다.

 

 

폴더에 마우스를 갖다대면 폴더 아이콘이 새로 나오는데, 그걸 클릭하면 vs code 새 창이 뜨면서 접속이 된다.

 

5. ubuntu 환경 초기 설정

이건 처음 우분투 환경을 셋업할때 이것저것 설치하는데 여기저기 왔다갔다 하면서 찾는게 번거로워서 여기 기록해둔다.

 

다음에 하게 되면 쉘 스크립트를 이용하면 좀 더 편하게 될 듯.

 

#!/bin/bash

apt-get update
apt-get upgrade

apt-get install sudo
sudo apt install net-tools
sudo apt-get install -y curl
sudo apt install vim
sudo apt-get install lsof

# nvm, npm, nodejs 설치
# nodejs 그냥 설치하면 버전이 자기 맘대로라 nvm을 이용해 설치하는게 좋다.

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
source ~/.bashrc
nvm --version
nvm install 18.15.0
node -v
npm install -g npm@latest

# git

apt-get install git
apt install git
git --version

git config --global user.name <your_name>
git config --global user.mail <your_email>

 

6. mysql 설치

처음엔 docker로 구동하는 ubuntu에 mysql도 설치할까 하다가

 

왠지 모르게 외부에서 연결이 안되서 분노가 끓어오르던 와중에

 

생각해보니 mysql도 따로 컨테이너를 만들어 돌리는게 더 좋지 않나 싶어서 따로 컨테이너를 생성했다.

 

마찬가지로 mysql 공식 이미지를 가져와 설치하면 된다.

 

 docker pull mysql
 docker run --name <container_name> -e MYSQL_ROOT_PASSWORD=<mysql_root_password> -d -p 3306:3306 mysql

 

 

 

윈도우의 workbench를 이용해, 컨테이너 내부에 있는 mysql과, 상호작용을 하고 싶다면 포트 포워딩을 해줘야 한다.

 

우리가 mysql 이미지를 받아와 컨테이너를 만들면, 거기엔 딱 mysql만 있는게 아니라, mysql을 구동하기 위한 

 

최소한의 운영체제가 설치되고, 마치 하나의 서버 혹은 머신처럼 구동된다.

 

 

내가 workbench에서 127.0.0.1:3306과 상호작용을 하고 싶으니 host name에 이 주소를 입력해도

 

이건 윈도우의 port 3006을 의미하므로 현재 컨테이너에서 돌아가는 port 3306과는 연결점이 없다.

 

그래서 윈도우의 3306, 컨테이너의 3306을 이어붙이기 위해서 포트 포워딩이 필요하다.

 

 

mysql은 우분투와는 상호작용 방법이 약간 다르다.

 

attach가 아닌 exec을 사용한다.

 

docker exec -it <conatainer_name> bash

 

이렇게 컨테이너에 접속하면 mysql이 바로 뜨는게 아니라 bash 터미널이 뜬다.

 

이는 우리가 cli에 방금 입력한 옵션과 관련이 있는데, 전술한것처럼 mysql은 혼자 단독으로 실행될 수 없다.

 

그걸 구동해줄 운영 체제가 docker라고 해도 어쨋든 있어야 한다. 

 

우리가 컨테이너에 접속하는데 그 운영체제와 먼저 만나게 되고,

 

그 운영체제와 상호작용을 어떤 방식으로 (어떤 터미널로) 할 것인지를 접속시 옵션으로 선택할 수 있는데,

 

그게 저 위 터미널 입력문의 bash 부분이다.

 

이 쉘에서 평소 mysql을 실행하던것 처럼 실행해주면 된다.

 

root 계정과 docker run 명령어 실행시 정한 root password를 사용해 mysql을 구동할 수 있다.

 

mysql -u root -p<password>

 

이제 mysql 셋업은 동일하다. 유저를 생성하고 권한 설정을 해주면 된다.

 

create user <'new_account'>@'%' identified by <'new_password'>;
flush privileges;
grant all privileges on *.* to <'new_account'>@'%';

 

참고로 docker desktop에서도 터미널을 사용할 수 있다.

 

 

 

7. container간 연결

이제 mysql과 ubuntu container를 연결해줘야 한다.

 

두 컨테이너를 연결해주기 위해선 docker network 기능을 활용하면 된다.

 

윈도우 터미널에 다음과 같이 입력한다.

 

# docker network 생성
docker network create <network 이름>

# container를 docker network에 연결
docker network connect <network 이름> <연결할 컨테이너 이름>
docker network connect <network 이름> <연결할 컨테이너 이름>
...

 

연결할 컨테이너는 지금은 ubuntu와 mysql을 넣으면 되지만 이외에도

 

다른 컨테이너를 연결하고 싶다면 그 컨테이너의 이름을 넣어주면 된다.

 

추가적으로 주의할 점은 db와 상호작용할 ubuntu 내의 서버 코드에서 db config를 설정할 때

 

db host 값을 localhost나 127.0.0.1이 아닌 container 이름으로 설정해줘야 한다.

 

# .env

DB_NAME=~~
DB_USER=~~
DB_PASSWORD=~~
DB_PORT=~~

# 127.0.0.1이나 localhost가 아닌 컨테이너 이름을 적는다.
DB_HOST=mysql

 

일요일 내내 이걸 하고 나서 생각해보니 어떻게든 mac에서 eer을 하는 방법을 찾는게 빨랐을 것 같긴 하지만

 

어차피 언젠가 한번은 해야 할 일이었고, 환경 셋업은 잊을만 하면 하는 날이 또 올테니..

 

docker라는게 뭔지 여러 설명을 들어봐도 통 와닿지가 않았었는데 일단 이론적인 부분은 미뤄두더라도

 

혼자서 여기저기 사용 방법을 찾아보면서 해보다보니 공부도 되고 배운 것도 많았던 것 같다.