Docker를 이용하여 클라우드에 Go 배포하기
본 글에서 사용할 기술스택인 Docker, Docker-compose, Gin, MySQL, Naver Cloud Platform입니다.Docker와 GO(Gin-Gonic)를 이용해서 클라우드(NCloud-MiniServer)에 배포해보겠습니다. NCloud가 아니더라도 사용하는 클라우드 인스턴스를 사용하면 됩니다.
1. NCloud(Cloud 준비)
Docker를 배포하기 위한 서버가 필요합니다. 본 글에서 Mini Server를 사용하겠습니다. NCloud Mini Server는 1년간 무료로 이용할 수 있습니다. AWS Free Tier 기간이 종료된 분들이라면 이용해 볼법합니다. NCloud는 처음 가입한 분들에게 3개월 10만원 크래딧을 제공합니다. NCloud 할인 링크
2. Go 설치
wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.14.4.linux-amd64.tar.gz
이 글을 20년 6월 현재 apt-get install golang
으로 설치면 Go 1.10 버전이 설치됩니다. 이렇게 설치할 경우 본 글의 Docker 설정에 맞지 않습니다. https://golang.org/dl/ Golang 공식 홈페이지에는 go 1.14.4가 stable version입니다. 따라서 wget 명려어를 이용하여 설치하겠스빈다.
export PATH=$PATH:/usr/local/go/bin
source ~/.profile
Go가 설치된 경로를 추가해줍니다.
go version
>
go version go1.14.4 linux/amd64
설치한 Go 1.14.4 버전을 확인합니다.
go get -u github.com/gin-gonic/gin
Gin-Gonic이라는 Go 프레임워크를 사용할 것입니다. 위의 명령어를 입력하여 Gin-Gonic을 설치합니다.
go get -u github.com/go-sql-driver/mysql
MySQL을 사용할 것이기에 Go와 MySQL을 연결해주는 드라이버를 설치합니다.
2. Docker 설치
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
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
apt-cache policy docker-ce
sudo apt install docker-ce
위의 명령어를 차례로 입력하여 Docker를 설치하도록 합니다. Dockerfile, docker-compose.yml, go.mod, go.sum, main.go 의 코드를 Code-Github 에서 가져오도록 합니다. 본 Go 코드는 mysql curd (with Gin) 에서 가져왔습니다.
3. MySQL 도커 이미지 가져오기
docker pull mysql:8.0.19
MySQL 8.0.19 버전의 도커 이미지를 리눅스 클라우드 머신에 가져옵니다.
docker run \
--detach \
--publish 3306:3306 \
--env MYSQL_USER="root" \
--env MYSQL_ROOT_PASSWORD=1234 \
mysql:8.0.19;
- run: MySQL 도커 이미지를 실행합니다.
- --detach: 백그라운드에서 동작합니다. docker ps를 입력하면 현재 실행중인 도커 이미지 목록을 볼 수 있습니다.
- --env: MySQL의 User ID를 root로, 초기 비밀번호를 1234로 설정합니다.
- mysql:8.0.19: 실행할 도커 이미지 이름이빈다.
mysql -h 0.0.0.0 -u root -p
위의 명령어를 입력하면 mysql 명령어를 찾을 수 없다고 나올 것입니다. 왜냐하면 MySQL을 리눅스 머신에 직접 설치한 것이 아니라 MySQL Docker Img를 가져온 것이기 때문입니다.
docker ps
>
CONTAINER ID IMAGE COMMAND
4a980a0d7dc9 mysql:8.0.19 "docker-entrypoint.s…"
docker ps를 통해서 MySQL의 CONTAINER ID를 확인하빈다.
docker exec -i -t 4a980a0d7dc9 bash
mysql -uroot -p
위의 명령어를 이용해서 docker의 bash에 접속합니다. 접속한 docker에서 MySql에 접속합니다. 위에서 --env의 인자로 주었던 root와 1234 비밀번호를 입력하면 MySQL에 접속할 수 있습니다.
create database user_db;
show databases;
use user_db;
show tables;
위의 명령어를 차례대로 입력합니다. 명령어의 의미는 위에서 차례대로 다음과 같습니다.
- user_db: user_db 데이터베이스를 생성합니다.
- show databases: MySQL에 저장된 데이터베이스 목록을 보여줍니다.
- use user_db: user_db 데이터베이스에 접근합니다.
- show tables: user_db에 저장된 테이블을 보여줍니다. 현재 추가한 데이터가 없기에 아무것도 보이지 않을 것입니다.
CREATE TABLE IF NOT EXISTS person(
id INT AUTO_INCREMENT,
first_name VARCHAR(25) NOT NULL,
last_name VARCHAR(25) NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
위와 같은 쿼리를 만듭니다. 위의 테이블에 클라이언트가 보낸 데이터가 저장될 것입니다.
4. Docker-compose 설치와 실행
apt install docker-compose
docker compose를 설치합니다.
docker-compose up -d
docker-compose.yml 파일이 있는 곳에서 위의 명령어를 입력합니다. -d 옵션을 이용해서 백그라운드로 실행합니다. 이 명령어로 Docker Compose에 정의되어있는 모든 서비스 컨테이너를 한 번에 실행할 수 있습니다.docker-compose down
을 이용하면 docker-compose.yml에 정의된 서비스 컨테이너를 한 번에 종료합니다.
5. Docker 실행
docker build . -t go-dock
docker run -p 3001:3001 go-dock
docker를 빌드하고, 실행합니다. 3001번 포트로 실행합니다.
6. 실행 확인
6-1. ping
curl http://49.50.175.XX:3001/ping
NCloud 서버가 아닌 로컬 컴퓨터의 터미널에서 위와 같은 명령어를 입력합니다.
- 49.50.175.XX 는 NCloud의 Public IP 입니다.
router.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
Github의 main.go 코드를 보면 /ping으로 GET Method에 대해서 JSON으로 "pong을 보냅니다."
6-2. POST
curl http://49.50.175.XX:3001/person -X POST -d '{"first_name": "fn_3", "last_name": "ln"}' -H "Content-Type: application/json"
> {"message":" fn_3 ln successfully created"}
curl의 명령이 성공적이라면 {"message":" fn_3 ln successfully created"}가 터미널에 출력될 것입니다.
Docker를 실행한 서버에서는 빨간색 박스와 같이 Post 메소드로 값을 200으로 받은 것을 볼 수 있습니다.
MySQL 도커 이미지에 접속해서 확인해보면 정상적으로 값이 저장된 것을 확인할 수 있습니다.
6-3. GET
http://49.50.175.XX:3001/persons/
를 브라우저에 입력하면 DB의 모든 값을 JSON으로 보여줍니다.
http://49.50.175.XX:3001/person/1
를 브라우저에 입력하면 DB의 첫번째 값을 JSON으로 보여줍니다.
'Computer Science > DevOps' 카테고리의 다른 글
Gin-gonic Hot Reloading 방법 (0) | 2020.07.11 |
---|---|
MySQL chown: changing ownership of 'var/lib/mysql': Operation not permitted 문제 해결 (12) | 2020.07.04 |
가상 스타트업으로 알아보는 MSA이야기 (0) | 2020.05.11 |
도커 이미지 기본 명렁어 (0) | 2020.05.10 |
도커 설치(Windows 10) 및 기본 명령어 (0) | 2020.05.10 |