== Tips
컨테이너를 대상으로하는 모든 명령어는 컨테이너의 이름 대신 ID를 사용할 수 있다.
- 그러나 이름이 너무 길 때는 앞의 2~3자만 입력해도 된다.
ex) docker start dd16c1ee6bf2
ex) docker start dd1
- ID 앞자리가 dd1인 다른 컨테이너가 이미 존재한다면 어느 컨테이너를 가리키는지 알 수 없으므로 에러가 발생
- 따라서 ID의 앞자리를 사용해 컨테이너를 제어할 때는 적절히 3~4자를 입력하는 것이 좋다.
== Docker
Docker
- 리눅스 컨테이너에 여러 기능을 추가함으로써 애플리케이션을 컨테이너로서 쉽게 사용할 수 있게 만든 프로젝트
가상 머신 장.단점
- 완벽한 운영체제를 생성할 수 있다.
- 일반 호스트에 비해 성능 손실이 있다.
- 수 기가바이트에 달하는 가상 머신이미지를 애플리케이션으로 배포하기는 부담스럽다.
Docker Container
== Docker를 시작해야 하는 이유
1. 애플리케이션의 개발과 배포가 편해진다.
- 사용자만의 독립된 개발 환경을 보장받을 수 있다.
- 컨테이너의 작업을 마친 뒤 배포를 할 때 도커 이미지라는 일종의 패키지로 만들어 서버에 전달하기만 하면 된다.
- 서비스를 개발했을 때 사용했던 환경을 다른 서버에서도 컨테이너로서 똑같이 복제할 수 있다.
- 개발/운영 환경의 통합이 가능해진다.
- Docker는 이미지 내용을 레이어 단위로 구성하며, 중복되는 레이어를 재사용해 배포 속도가 매우 빠르다.
2. 여러 애플리케이션의 독립성과 확장성이 높아진다.
- 모놀리스(Monolith) 어플리케이션 : 소프트웨어의 여러 모듈이 상호작용하는 로직을 프로그램 내에서 구동시키는 방식
- Microservices 구조 : 여러 모듈이 독립된 형태로 구성
- 언어에 종속되지 않고 변화에 빠르게 대응할 수 있고, 각 모듈의 관리가 쉬워진다.
- 여러 모듈에게 독립된 환경을 동시에 제공할 수 있다.
- 개발자가 직접 구현하기보다는 도커 스웜 모드, 쿠버네티스 등의 오케스트레이션 플랫폼을 사용하는게 일반적
- 웹 서비스 : 데이터베이스 컨테이너 / 웹 서버 컨테이너로 분리된다.
== Docker 설치 방법 LINUX
$ uname -r
- Docker를 설치할 때 운영체제의 커널은 3.10 버전 이상이어야 한다.
- 현재 운영체제의 커널 버전을 확인한다.
도커 컨테이너
- 도커 이미지로 컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일이 들어있는 파일시스템,
- 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성
- 컨테이너는 이미지에서 변경된 사항만 컨테이너 계층에 저장하므로 원래 이미지는 영향을 받지 않는다.
- 컨테이너에서 기본 사용자는 root이고 호스트 이름은 무작위의 16진수 해시값이다.
== Docker Run
- -d : -i -t 가 컨테이너 내부로 진입하도록 attach 가능한 상태로 설정
- -d : Detached 모드로 컨테이너를 실행한다.
- Detached모드 : 컨테이너를 백그라운드에서 동작하는 어플리케이션으로 실행한다.
- Detached 모드 컨테이너는 반드시 컨테이너에서 프로그램이 실행돼야한다
- 포그라운드 프로그램이 실행되지 않으면 컨테이너는 자동으로 종료된다.
- -i, -t : 표준 입출력이 활성화된, 상호작용이 가능한 셀 환경을 사용할 수 있다.
- docker ps 명령어에서 컨테이너 목록을 확인할 때 COMMAND에 표시되는 /bin/bash가 여기에 해당
- -e : 컨테이너 내부의 환경변수를 설정한다.
ex) -e MYSQL_ROOT_PASSWORD=password : MYSQL_ROOT_PASSWORD 환경변수를 password로 등록한다.
- --link : 내부 IP를 알 필요 없이 항상 컨테이너에 별명(alias)로 접근하도록 설정한다.
ex) --link wordpressdb:myslq
- wordpressdb의 IP를 몰라도 mysql이라는 호스트명으로 접근할 수 있다.
- wordpress 웹 서버 컨테이너에서 mysql이라는 호스트 이름으로 요청을 전송하면 wordpressdb 컨테이너의 내부 IP로 접근
ex) docker exec wordpress curl mysql:3306 --silent
- --link에 입력된 컨테이너가 실행 중이지 않거나 존재하지 않는다면 --link를 적용한 컨테이너를 실행할 수 없다.
- 도커 브리지(bridge) 네트워크를 사용하면 --link 옵션과 동일한 기능을 사용할 수있다.
$ docker exec -i -t test-mysql-db /bin/bash
- 컨테이너 내부에서 명령어를 실행한 뒤 그 결과값을 반환받을 수 있다.
- -i, -t 옵션으로 /bin/bash를 상호 입출력이 가능한 형태로 exec 명령어를 사용
- 단순히 exec만 사용한다면 컨테이너 내부에서 실행한 명령어에 대한 결과만 반환한다.
== 도커 사용법
$ docker -v
- 도커 엔진의 버전 출력
$ docker run
- 컨테이너를 생성하고 실행하는 역할
- 컨테이너를 정지하지 않고 빠져오는 것 : Ctrl + P, Q
$ docker run -i -t ubuntu:14.04
- -i : 상호 입출력
- -t : tty를 활성화 해 bash 쏄을 사용하도록 컨테이너를 설정
- ubuntu:14.04 이미지가 로컬 도커에 존재하지 않으므로, 도커 허브에서 자동으로 이미지를 내려받는다.
$ docker pull centos:7
- 도커 공식 이미지 저장소에서 centos:7 이미지를 내려받는다.
$ docker images
- 도커 엔진에 존재하는 이미지의 목록을 출력한다.
$ docker create
- 컨테이너를 생성할 때 run 대신 사용할 수 있다.
- 컨테이너를 생성할 뿐 컨테이너로 들어가지 않는다.
$ docker create -i -t --name mycentos centos:7
- -i : 상호 입출력
- -t : tty를 활성화 해 bash 쏄을 사용하도록 컨테이너를 설정
- --name : 컨테이너의 이름을 mycentos로 설정
$ docker start mycentos
- mycentos 이름의 컨테이너를 시작한다.
$ docker attach mycentos
- mycentos 이름의 컨테이너 내부로 들어간다.
run과 create 명령어의 차이
- RUN : docker pull > docker create > docker start > docker attach
- CREATE : docker pull > docker create
$ docker ps
- 정지되지 않은 컨테이너만 출력
- exit를 사용해 빠져나온 컨테이너는 정지 상태이기 때문에 컨테이너 목록에 출력되지 않는다.
- CONTAINER ID : 컨테이너에게 자동으로 할당되는 고유한 ID
- IMAGE : 컨테이너를 생성할 때 사용된 이미지의 이름
- COMMAND : 컨테이너가 시작될 때 실행될 명령어
- CREATED : 컨테이너가 생성되고 난 뒤 흐른 시간을 나타낸다.
- STATUS : 컨테이너의 상태, 컨테이너가 실행 중 : Up, 종료된 상태 :Exited, 일시 중지 : Pause
- NAMES : 컨테이너의 고유한 이름, --name 으로 설정하지 않으면 임의로 이름을 설정한다.
- 중복될 수 없지만, docker rename으로 컨테이너의 이름을 변경할 수 있다.
ex) docker rename test-db my-db
- test-db 에서 my-db로 이름을 변경한다.
$ docker ps -a
- -a : 정지된 컨테이너를 포함한 모든 컨테이너를 출력할 때 사용
- 컨테이너의 상태는 STATUS 항목에서 확인한다.
- Exited : 정지된 상태
- seconds : 실행 중인 상태
$ docker ps -a -q
- -a : 컨테이너 상태와 관계 없이 모든 컨테이너를 출력
- -q : 컨테이너의 ID만 출력한다.
$ docker ps --format "table {{.ID}}\t{{.Status}}\t{{.Image}}"
- ps 명령어를 Go 템플릿을 입력해 원하는 정보만 출력할 수 있다.
$ docker rm test-db
- 더이상 사용하지 않는 컨테이너를 삭제
- test-db 이름의 컨테이너를 삭제한다.
- 실행 중인 컨테이너는 삭제할 수 없다. / 하지만 강제로 삭제할 수 있는 옵션을 추가할 수 있다.
$ docker rm -f test-db
- 실행중인 컨테이너를 -f 옵션으로 강제로 삭제
$ docker ps -a
- 정지된 컨테이너를 포함한 모든 컨테이너를 출력한다.
- test-db가 삭제되었는지 확인한다.
$ docker stop test-db
- 컨테이너를 정지한다.
$ docker container prune
- 모든 컨테이너를 삭제
$ docker stop $(docker ps -a -q)
- 실행 상태와 관계없이 모든 컨테이너를 정지한다.
$ docker rm $(docker ps -a -q)
- 실행 상태와 관계없이 모든 컨테이너를 삭제한다.
== 컨테이너를 외부에 노출
$ docker run -i -t -p 3306:3306 -p 192.168.0.100:7777:80 ubuntu:14.04
- 호스트의 7777번 포트를 컨테이너의 80번 포트와 연결한다.
- -p : 여러 개의 포트를 외부에 개방 / 호스트의 3306 포트를 3306 컨테이너 포트로 열어준다.
- -p 80 : 컨테이너의 80번 포트를 쓸 수 있는 호스트의 포트 중 하나와 연결한다
- 호스트의 어느 포트와 연결됐는지 알 수 없으므로 docker ps 명령어로 PORTS 항목을 확인해야한다.
$ docker run -i -t --name test-ubuntu -p 7779:80 ubuntu:14.04
$ apt-get update
$ apt-get install apache2 -y
$ service apache2 start
- 아파치 웹서버를 설치하고 실행한다.
$ docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
- 도커 이미지 저장소에서 mysql5.7을 설치한다.
- MySQL 비밀번호는 password
- MySQL 데이터베이스는 wordpress
$ docker run -d \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \
--link wordpressdb:mysql \
-p 80 \
wordpress
- 도커 이미지 저장소에서 wordpress를 설치한다.
- -p 80 : 호스트의 (임의의) 포트 중 하나와 컨테이너의 80번 포트가 연결된다.
- 컨테이너 이름을 wordpress라 지정한다.
- -d : -i -t 가 컨테이너 내부로 진입하도록 attach 가능한 상태로 설정
- -d : Detached 모드로 컨테이너를 실행한다.
- Detached 모드는 컨테이너를 백그라운드에서 동작하는 어플리케이션으로 실행한다.
$ docker port wordpress
- wordpress라는 이름의 컨테이너가 사용 중인 호스트의 포트가 출력
-- 내가 참여중인 모든 모임의 정보를 가져온다. [방장은 무조건 방에 소속되어 있음]
1. userId가 참여중인 postId를 가져온다.
SELECT DISTINCT postId FROM Channels WHERE userId = 1;
2. Sub Query를 사용해 postId에 해당하는 Posts 정보를 가져온다.
SELECT postId, title, postImg, maxMember, startDate, endDate, place
FROM Posts
WHERE postId IN (SELECT DISTINCT postId
FROM Channels
WHERE userId = 1)
;
3. Sub Query를 JOIN으로 변경한다.
SELECT p.postId, p.title, p.postImg, p.maxMember, p.startDate, p.endDate, p.place
FROM Posts AS p
JOIN Channels AS c
ON c.postId = p.postId
WHERE c.userId = 1
;
4. currentMember를 추가한다.
SELECT p.postId, p.title, p.postImg, COUNT(*) AS currentMember, p.maxMember, p.startDate, p.endDate, p.place
FROM Posts AS p
JOIN Channels AS c
ON c.postId = p.postId
WHERE c.userId = 1
GROUP BY c.postId
;
5. LIMIT을 지정한다.
SELECT p.postId, p.title, p.postImg, COUNT(*) AS currentMember, p.maxMember, p.startDate, p.endDate, p.place
FROM Posts AS p
JOIN Channels AS c
ON c.postId = p.postId
WHERE c.userId = 1
GROUP BY c.postId
LIMIT 0, 5
;
-- 받은 친구 요청 목록 검색
1. 모든 친구 목록을 조회한다.
SELECT * FROM Friends;
2. 받은 친구 목록을 조회한다.
SELECT * FROM Friends WHERE receiveUserId = 1;
3. 서로 친구인 경우 목록에서 제외한다.
SELECT giveUserId FROM Friends WHERE receiveUserId = 1;
SELECT * FROM Friends WHERE giveUserId IN (SELECT giveUserId FROM Friends WHERE receiveUserId = 1)
'항해99 > 필기노트' 카테고리의 다른 글
[필기노트] Docker Volume, SQL (0) | 2021.08.05 |
---|---|
[필기노트] PROCEDURE, 인증메일 구성방법 (0) | 2021.08.04 |
[필기노트] pm2, Linux bash, SQL, Socket (0) | 2021.08.01 |
[필기노트] 실시간 통신 논리구조, Socket (0) | 2021.07.30 |
[필기노트] SQL, 5개 Table 조회 (0) | 2021.07.29 |