도커는 vm ware 프로그램과 가장 비슷하다.
vm ware는 가상 머신을 생성해줬다.
도커도 마찬가지로 가상머신을 생성하는건데 정확히 얘기하자면 가상머신이 아닌 컨테이너라고 한다.
vm ware 같은 하이퍼 바이저 프로그램이 만들어주는 가상머신이랑 도커가 만들어주는 컨테이너를 구분지을 수 있어야 한다.
리눅스에 기본적으로 컨테이너라는 기능이 있었다.
개발자나 엔지니어들이 이렇게 까지 쓸 수 있나 라는 걸 잘 몰라서 잘 안쓰는 기능이였다.
docker는 이걸 활용을 잘 해서 많이 쓰게 됨.
많은 서버들을 사용해서 3 티어 구성을 했었다.
서버 부하를 줄이기 위해서
안정성 때문에
하나의 컴퓨터에 다 구성해놓으면 하나의 컴퓨터가 털리면 가장 중요한 db가 털려버림.
각 컴퓨터로 3계층을 나누었는데, 이런 경우 서버 확장을 위해 컴퓨터를 더 늘리다 보면 운영체제를 계속해서 더 깔아줘야함.
각 컴퓨터마다 운영체제 메모리가 낭비되고 있음.
하나의 컴퓨터는 운영체제 하나 공유해서 사용해서 메모리를 덜 낭비함.
격리는 시켜야 되는데, 운영체제 낭비는 또 싫다.
그렇기 때문에 컨테이너를 사용함.
하나의 좋은 컴퓨터에 격리된 환경을 만들어준다.
vm ware 같은 경우 window 운영체제가 있다면, 그 위에 vm ware를 두고 그 위에 각 가상 환경을 생성했다.
그런데 이런 가상 환경을 만들어도 각 운영체제를 설치해야 했다.
docker는 각자 격리된 환경에서 하나의 운영체제를 공유해서 사용함.
docker는 linux의 컨테이너 기능을 사용하는 것임.
더 자세히 말하자면 운영체제 위에 docker engine이 있고 그것이 컨테이너들을 생성해주는 것이다. vm ware와 비슷하면서 다르다.
컨테이너는 윈도우에서 만들 수 없다.
그렇기 때문에 윈도우 컨테이너를 만들 수 없다.
완전한 격리를 시키기 위해서, 완전한 docker를 만들기 위해서는 linux 상에서 메모리 격리, mount 격리, uts, ipc, 네트워크 등등 전부 수동으로 해줘야 한다.
하지만 docker 명령어를 입력하면 이러한 과정들을 전부 자동으로 해준다!
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --enable docker-ce-nightly
yum-config-manager --enable docker-ce-test
yum install -y docker-ce docker-ce-cli containerd.io --allowerasing
systemctl restart docker
systemctl enable docker
도커 파일은 컨테이너를 만들고 해야하는 일련의 작업들을 미리 선언함으로써 매번 해당 작업을 하지않고도, 컨테이너 생성시 자동으로 등록된 작업이 실행된 후 컨테이너를 생성할 수 있는 파일
매뉴얼 작업을 기록한 Dockerfile 생성 (파일의 이름이 Dockerfile)
빌드 명령어가 Dockerfile 을 읽어 이미지를 생성
FROM alpine:latest # FROM 베이스 이미지 지정
RUN apk update && apk add figlet # RUN 컨테이너에서 실행할 명령어 지정
ADD ./message /message # ADD 컨테이너에 추가할 파일, 현재 디렉토리의 message 파일을 컨테이너의 / 디렉토리에 배치
CMD cat /message | figlet # CMD 컨테이너가 실행 된 후 실행할 명령어 지정
COPY [원본] [사본] # 컨테이너 내 파일을 컨테이너의 다른 곳에 복사
ENV [변수]=[값] # 환경 변수 설정
EXPOSE [포트] # 공개 포트 설정
WORKDIR [경로] # 컨테이너 내에서 작업 디렉토리 지정, cd 같은 것
MAINTAINER [이름] # 이미지에 대한 작성자 추가
FROM alpine:latest
RUN apk update && apk add figlet
ADD ./message /message
CMD cat /message | figlet
CREATE DATABASE web;
use web;
CREATE TABLE student (sname VARCHAR(10), sage INT);
INSERT INTO student VALUES('kim',10);
INSERT INTO student VALUES('lee',20);
INSERT INTO student VALUES('park',30);
INSERT INTO student VALUES('sim',40);
FROM tomcat:9.0.73-jdk8-corretto-al2
RUN rm -rf /usr/local/tomcat/conf/server.xml
ADD ./server.xml /usr/local/tomcat/conf/server.xml
RUN mkdir /usr/local/tomcat/webapps/cdh
ADD ./db.jsp /usr/local/tomcat/webapps/cdh/db.jsp
ADD ./mysql-connector-java-8.0.19.jar /usr/local/tomcat/lib/
EXPOSE 8080
EXPOSE 8009
CMD catalina.sh run
<Context path="" docBase="cdh" reloadable="true" />
<Connector protocol="AJP/1.3"
address="0.0.0.0"
secretRequired="false"
port="8009"
redirectPort="8443" />
docBase는 내가 cdh 폴더 밑에 db.jsp 파일을 만들것이기 때문에 cdh로 정했다.
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Connection conn = null;
ResultSet rs = null;
String url = "jdbc:mysql://200.200.200.10:3306/web?serverTimezone=UTC";
String id = "root";
String pwd = "qwer1234";
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, id, pwd);
Statement stmt = conn.createStatement();
String sql = "SELECT sname FROM student";
rs = stmt.executeQuery(sql);
while(rs.next()) {
out.println(rs.getString("sname"));
}
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
%>
</body>
</html>
FROM httpd:latest
ADD ./mod_jk.so /usr/local/apache2/modules/mod_jk.so
ADD ./workers.properties /usr/local/apache2/workers.properties
RUN rm -rf /usr/local/apache2/conf/httpd.conf
ADD ./httpd.conf /usr/local/apache2/conf/httpd.conf
EXPOSE 80
CMD httpd-foreground
yum install httpd httpd-devel gcc gcc-c++
wget https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz
tar zxvf tomcat-connectors-1.2.48-src.tar.gz
cd tomcat-connectors-1.2.48-src/native/
./configure --with-apxs=/usr/bin/apxs
yum install -y make
yum install -y redhat-rpm-config
make
위의 모듈들을 설치하고 실행하면, tomcat-connectors-1.2.48-src/native/apache-2.0 밑에 mod_jk.so 생성됨
해당 파일을 docker를 실행할 디렉토리에 복사
worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=200.200.200.10
worker.worker1.port=8009
LoadModule jk_module /usr/local/apache2/modules/mod_jk.so
<IfModule jk_module>
JkWorkersFile /usr/local/apache2/workers.properties
JkLogFile /usr/local/apache2/logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkMount /*.jsp worker1
</IfModule>