AWS EC2 인스턴스 (Ubuntu 20.04)를 만들고
여기에 Docker를 설치한다.
필요도구 :
AWS EC2
, ssh 원격접속 프로그램(MobaXterm)
우분투 버전에 Docker 설치는 Docker 설치가이드를 참조하자.
https://docs.docker.com/engine/install/debian/
docker 설치 확인
docker --version
# Docker는 설치되자마자 deamon으로 돌아간다.
sudo systemctl status docker
확인해 보면, active (running)
가 뜰 것이다.
그 후 docker 설치 처리는 이 블로그 참고.
https://velog.io/@mooh2jj/AWS-EC2-Docker-설치
Dockerfile: base image 파일로 image 만드는 일련의 과정들
을 정리해 놓은 파일
docker는 Dockerfile
을 이용하여 손쉽게 동일한 이미지를 반복해서 만들수 있다.
# example 폴더를 만들고 그곳에 Dockerfile을 만든다.
ubuntu@ip-172-31-32-99:~$ mkdir example
ubuntu@ip-172-31-32-99:~$ cd example/
ubuntu@ip-172-31-32-99:~/example$ sudo vi Dockerfile
ubuntu@ip-172-31-32-99:~/example$ cat Dockerfile
Dockerfile
FROM ubuntu:18.04
MAINTAINER Doseonggon <ehtjd33@gmail.com>
RUN apt-get update
RUN apt-get install -y apache2 #install Apache web server (Only 'yes')
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]
Dockerfile 문법
- FROM : 베이스 이미지 지정/ 내가 만든 이미지도 가능
- MAINTAINER : 개발자 정보를 나타냄, 보통 개발자 이메일을 적음.
- RUN : 명령어 실행. -y : 꼭 넣어주기
- EXPOSE : 컨테이너로 실행 시 노출시킬 포트. 단순히 해당 포트를 사용한다는 것을 명시하는 것. 이를 사용해도 run 명령어(도커 실행)에서 -P 옵션도 필요
- CMD : 컨테이너가 시작될 때마다 실행할 명령어를 설정. Dockerfile에서 한 번만 사용 가능.
그외 명령어는 https://ryu-e.tistory.com/10 참조.
Dockerfile build
docker build [OPTIONS] 도커파일경로
# Dockerfile이 있는 경로
docker build -t example .
-t
: tag의 의미. tag로 example
로 하겠다는 뜻.# docker 이미지 확인
docker images
docker run -p 80:80 example
docker 컨테이너 확인
docker ps -a
인바운드 규칙 편집으로 80포트를 열고 브라우저 url로 확인.
우분투(18.04) + apache2 서버 열려있으면 아래 페이지가 뜬다.
다시 php 서버가 설치가 되게, Dockerfile을 수정해본다.
Dockerfile
FROM ubuntu:18.04
MAINTAINER Doseonggon <ehtjd33@gmail.com>
RUN apt-get update
RUN apt-get install -y apache2 #install Apache web server (Only 'yes')
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:ondrej/php # For Installing PHP 5.6
RUN apt-get update
RUN apt-get install -y php5.6
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]
docker build -t example .
설치시, 이런 옵션을 눌러야 되는 화면이 뜬다. 이런 옵션이 나오는 것은 중단없는 배포시 좋지 않다. 이 옵션을 제거하는 방법이 있다.
Please select the geographic area in which you live. Subsequent configuration
questions will narrow this down by presenting a list of cities, representing
the time zones in which they are located.
1. Africa 4. Australia 7. Atlantic 10. Pacific 13. Etc
2. America 5. Arctic 8. Europe 11. SystemV
3. Antarctica 6. Asia 9. Indian 12. US
Geographic area:
Dockerfile에
ENV DEBIAN_FRONTEND=noninteractive
을 추가해주는 것이다.
해당 Dockerfile을 아래 내용대로 수정해보자. 실행에 옵션이 사라지고 설치가 완료될 것이다.
FROM ubuntu:18.04
MAINTAINER Doseonggon <ehtjd33@gmail.com>
# Avoding user interaction with tzdata
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install -y apache2 #install Apache web server (Only 'yes')
RUN apt-get install -y software-properties-common
RUN add-apt-repository ppa:ondrej/php # For Installing PHP 5.6
RUN apt-get update
RUN apt-get install -y php5.6
EXPOSE 80
CMD ["apachectl", "-D", "FOREGROUND"]
💥Docker 이미지 삭제
참고로 image가 설치에 오류가 되서 빠지고 확인해보면 <none>
이라는 표시로 되있을 것이다. 서버에 용량도 많이 차지 하는 image들은 삭제하는 것이 좋다.
# 이미지 삭제 명령어
docker rmi -f [image id]
해당 Apache 서버 페이지를 새로고침을 해놓으면 아래 화면이 뜰 것이다.
docker run -p 80:80 -v /home/ubuntu/example/html:/var/www/html example
-v
: volume 다른 외부서버에 마운트를 해준다. 여기선 외부 php서버에게도 example
폴더로 연결(마운트)시키는 것이다.# 다른 터미널에서 해당경로로 이동한 후
ubuntu@ip-172-31-32-99:~/example/html$ sudo vi index.php
index.php
# php 기본정보 출력한다는 뜻
<?php phpinfo(); ?>
해당 php info가 표시가 페이지가 브라우저에서 확인이 된다.
이제 Docker로 mysql container를 만들어보자.
원래는 DB서버 같은 경우, AWS EC2에 직접 설치하지 않고 영구적 보관을 위해 AWS RDS
를 쓴다. 하지만 이번 기회에 EC2에 직접 설치하는
것도 배워보자.
mysql은 이미 dockerHub에 등록된 게 있으니 바로 run 하여 컨테이너를 바로 실행시킬 수 있다.
더 자세한 건 이 블로그를 참조해주길 바란다.
http://jmlim.github.io/docker/2019/07/30/docker-mysql-setup/
여기서는 외부에 접속할 포트를 9876
으로 설정했다.
EC2 인스턴스 보안 네트워크 규칙에서 9876
포트를 열어주어야 한다.
docker run \
--name mysql_db \
-d \
--restart unless-stopped \
-e MYSQL_ROOT_PASSWORD=1234 \
-e TZ=Asia/Seoul \
-p 3306:3306 \
-v /mysql/conf.d:/etc/mysql/conf.d \
mysql/mysql-server:5.7
docker run \
--name mysql_8.0 \
-d \
--restart unless-stopped \
-e MYSQL_ROOT_PASSWORD=1234 \
-e TZ=Asia/Seoul \
-p 3306:3306 \
-v /mysql/conf.d:/etc/mysql/conf.d \
mysql:8.0.22 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_0900_ai_ci
## 윈도우의 경우 path / 더 붙이기
docker run \
--name mysql_8.0 \
-d \
--restart unless-stopped \
-e MYSQL_ROOT_PASSWORD=1234 \
-e TZ=Asia/Seoul \
-p 3306:3306 \
-v //mysql//conf.d://etc//mysql//conf.d \
mysql:8.0.22 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_0900_ai_ci
✨윈도우의 경우 path 표시시,
-v //mysql//conf.d://etc//mysql//conf.d
: 앞에/
를 붙여준다. 참고 (이스케이프
)
여기서 -v /my/custom:/etc/mysql/conf.d
는 mysql을 설치한 OS내 /mysql/conf.d
과 docker 컨테이너 내 /etc/mysql/conf.d
와 연결해준다는 의미다.
docker-compose.yml
version: '3.8'
services:
mysql_8.0:
image: mysql:8.0.22
container_name: mysql_8.0
restart: unless-stopped
environment:
# MYSQL_ROOT_HOST: '%' # '%'는 모든 호스트를 의미
MYSQL_ROOT_PASSWORD: 1234
# MYSQL_DATABASE: shop
TZ: Asia/Seoul
ports:
- "3306:3306"
volumes:
- /mysql/conf.d:/etc/mysql/conf.d
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_0900_ai_ci
docker-compose 실행
# 실행
docker-compose up -d
# 중지
docker-compose down
실행되는 docker 컨테이너 확인
docker ps
mysql 컨테이너에 직접 명령 실행
docker exec -it [containerID] bash
or
docker exec -it [containerID] /bin/bash
mysql> 들어가기
mysql -u root -p [password]
# mysql -u [user] -p -h [host주소]
# mysql -h [host주소] -u [user] -p
mysql> CREATE DATABASE TEST;
mysql> SHOW DATABASES;
mysql> USE [database];
mysql-cilent 설치
sudo apt install mysql-client-core-8.0
실제 mysql tool로 접속이 되는지 확인해보자. DBTool로 Hedisql
를 사용해보았다.
접속이 잘되는 것을 확인할 수 있다. 위에 만들어 두었던 TEST
데이타베이스가 있는 것을 확인할 수 있다.
✅DB 권한 설정
다시한번 mysql로 들어가(mysql -u root -p [password]
) 권한 설정도 가능하다.
CREATE USER 'dsgdocker'@'%' IDENTIFIED BY '1234'
GRANT ALL PRIVILEGES ON *.* TO 'dsgdocker'@'%';
FLUSH PRIVILEGES;
QUIT
EXIT
mysql -u root -p 비밀번호
CREATE USER '계정명'@'%' IDENTIFIED BY '비밀번호';
GRANT ALL PRIVILEGES ON *.* TO '계정명'@'%';
FLUSH PRIVILEGES;
QUIT
exit
or ctrl+d
권한 설정한 아이디에도 접속이 된다.
이로써 도커를 통해서 mysql로 설치가 가능하다는 것을 확인해보았다.
mysql confing파일을 수정할 시, container에 bash안에서 설정을 해주어야 한다. 설정파일을 수정할려면 편집기 vim을 설치해주어야 한다.
docker exec -it [mysql컨테이너ID] /bin/bash
vim /etc/mysql/my.cnf
# bash: vi: command not found
vi: command not found
문제로 vi를 설치해주어야 한다.
리눅스 종류 확인
cat /etc/*-release
vi 설치
# 우분투
sudo apt-get update
sudo apt-get install vim
# Red Hat
sudo yum update
sudo yum install vim
# 이것도 안되면!
microdnf install -y vim