Docker 연습

반응형

 

Dockerfile

FROM ubuntu:16.10
MAINTAINER Jack Kim <dmk3141618@gmail.com>

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:newpassword' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

#SSH login fix. Otherwise user is kiccked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

 

 

.dockerignore

# Created by .ignore support plugin (hsz.mobi)
### Example user template template
### Example user template

# IntelliJ project files
.idea
*.iml
out
gen

 

 

sudo 매번 입력 싫다면

sudo usermod -aG docker ${USER}
sudo service docker restart

docker start
docker stop
docker restart
docker pause
docker unpause
docker wait
docker kill
docker attach
docker exec

docker search redis

docker pull redis:latest (태그이름을 latest 로 하면 최신 이미지)

docker run -i -t --name myredis -d redis
-i -t 는 terminal interactive mode
-d 는 데몬 형태로 계속 떠 있도록
출력된 문자열은 컨테이너 id 임.

docker ps -a 에서 -a 는 정지된 컨테이너도 보여준다.
docker start myredis 컨테이너 ID 를 입력해도 된다.

docker exec -it <컨테이너 이름> /bin/bash
docker attach 의 경우는 상황에 따라 안 될 가능성이 많다.
docker exec -it myredis /bin/bash
-it 는 -i -t 의 줄임말.
맨 마지막에 명령을 실행하여라 라는 뜻. /bin/bash 셸을 실행해라.

docker rm <컨테이너 이름>
docker rmi <이미지 이름>:<태그>
태그를 입력하지 않으면 모든 태그가 삭제됨.

$ docker exec -it myredis /bin/bash
root@6905981d40bb:/data# redis-cli
127.0.0.1:6379> set mykey "hello"
OK
127.0.0.1:6379> get mykey
"hello"
root@6905981d40bb << 이건 컨테이너 id 임.

docker start my-container
docker exec -it my-container myjob.sh
docker logs -ft my-container

CPU share constraint
docker run -ti --c 512 ubuntu:16.04 /bin/bash
--c 또는 --cpu-share
기본값은 1024 이고 100%를 의미함.
512이면 50%

Memory share constraint
docker run -ti --m 300M ubuntu:16.04 /bin/bash
--m 또는 --memory
메모리 제한 값
최소 4M
별도의 설정이 없다면 swap 도 300M
(swap + memory) = 600M
단위: b, k, m, g

Memory share constraint
docker run -ti --m 300M --memory-swap 1G ubuntu:16.04 /bin/bash
(swap + 메모리) 제한 값
단위: b, k, m, g
위의 경우 memory 는 300M swap 은 700M 로 합치면 1G 됨.

실행 중인 모든 컨테이너를 죽인다
docker kill $(docker ps -q)

정지된 것을 포함해서, 모든 컨테이너를 삭제한다.
docker rm $(docker ps -a -q)

오래된 컨테이너를 삭제한다.
docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm

정지된 컨테이너를 삭제한다.
docker rm -v $(docker ps -a -q -f status=exited)

불필요한 이미지를 제거한다.
docker rmi $(docker images -q -f dangling=true)

불필요한 볼륨을 제거한다.
docker volume rm $(docker volume ls -q dangling=true)

도커 허브 사용 못한다면 컨테이너 이미지를 파일로 저장하고 불러올 수도 있다.
Load / Save Image
docker load < my_image.tar.gz
docker save my_image:my_tag > my_image.tar.gz

Load / Save Container
cat my_container.tar.gz | docker import - my_image:my_tag
docker export my_container > my_container.tar.gz

Read-only Container
docker run --read-only


Monitoring #1
하나의 컨테이너의 자원 사용량 모니터링 (CPU, memory, network I/O)
docker stats <container>
모든 컨테이너의 자원 사용량 모니터링 (컨테이너 ID 로 정렬)
docker stats $(docker ps -q)
docker ps -a --format 'table {{.ID}}\t{{.Command}}'
이렇게 하면 CONTAINER ID / COMMAND 열로 정보가 나옴.

Monitoring #2
이름 순으로 정렬하여 모니터링 하기
docker stats $(docker ps --format '{{.Names}}')
"ubuntu" 이미지로 만들어진 컨테이너 찾기
docker ps -a -f ancestor=ubuntu

이미지를 빌드하는 두가지 방법
docker commit 명령어
Dockerfile 작성 후 docker build 명령어

docker run -it ubuntu /bin/bash 우분투 최신 이미지 다운 받아서 실행
apt-get -yqq update
apt-get -y install apache2 아파치2 설치
exit 컨테이너 밖으로 나옴
docker ps -a
docker commit <CONTAINER ID> thewavelet/apache2
docker images thewavelet/apache2
docker commit -m="new apache2 image" --author="thewavelet" <CONTAINER ID> thewavelet/apache2:webserver
docker inspect thewavelet/apache2
docker run -it thewavelet/apache2:webserver /bin/bash
docker images
docker run -d -p 80:80 webserver /usr/sbin/apache2ctl -D FOREGROUND

docker run -it --detach=true ubuntu bash
docker ps
docker rename hopeful_wilson newname
docker inspect newname | less
docker network ls
docker network create newnet
docker network inspect newnet | less
docker network connect newnet newname
docker inspect newname
ping 172.18.0.2
ping 172.17.0.2


apt install apt-transport-https ca-certificates
apt install linux-image-extra-$(uname -r) linux-image-extra-virtual
apt install docker-engine
docker info
docker run -it ubuntu bash
docker network connect newnet newname
nano dockerfile
docker run -d -p 80:80 webserver /usr/sbin/apache2ctl -D FOREGROUND

docker search apache/ubuntu | less
docker search ubuntu | less
docker pull ubuntu-upstart
docker run -it ubuntu-upstart /bin/bash



.dockerignore 형식
Context 의 root directory 에 위치,
# 주석
*/temp*     : 서브디렉터리에서 temp 로 시작하는 파일과 디렉토리 제외
*/*/temp*   : 2레벨 이상의 디렉토리에 있는 temp 로 시작하는 파일, 디렉토리 제외
**/*.java   : 깊이에 상관없이 모든 java 소스 파일 제외
temp?       : temp 로 시작하는 5글자 파일, 디렉토리 제외
go 의 패턴매칭 참고.

docker build -t "thewavelet/sshd" .
docker history
docker run -d -P --name test_sshd thewavelet/sshd
docker port test_sshd 22 (포트를 노출 시킴)
docker inspect --format '{{ .NetworkSettings.IPAddress }}' test_sshd
컨테이너의 IP 주소를 확인하는 명령임.
설치하는 도커의 종류나 버전에 따라 접속해야 할 ip 가 다를 수 있는데
네이티브하게 설치된 도커 즉 도커포맷이나 우분투 같은 건 로컬 호스트로 바로 접속 가능하지만
부트2도커와 같은 환경으로 하이퍼바이저 환경으로 설치했을 경우 ip 주소 확인 후 해당 ip 로 접속해야 함.
위의 경우 바로 로컬호스토 접속 됨.
ssh root@localhost -p 32768
docker port test_sshd 22 (위에서 이것을 했을 때 32768을 리턴하는데 이것이 로컬의 컨터이너 22번과 연결되는 포트임)

빌드 시에 오류가 나면 오류난 시점부터 다시 실행되는데
아래와 같이 하면 그 캐시 무시하고 다시 빌드
docker build --no-cache
캐시의 일부만 원할 때. 수정이 일어나면 수정된 부분 부터만 하고자 할 때
FROM ubuntu:16.04
...
ENV UPDATED_AT 2017-02-01
RUN apt-get -qq update
...

왼쪽이 호스트의 포트,
오른쪽이 컨테이너 내부에서 사용하는 포트.
docker run -d -p 22:22 --name test_sshd2 thewavelet/sshd
docker run -d -p 2345:22 --name test_sshd3 thewavelet/sshd
ssh root@localhost


도커파일 명령어
ENV <key> <value>
ENV <key>=<value>
${A:-B} : A(o) -> A, A(x) -> B
${A:+B} : A(o) -> B, A(x) -> empty
FROM ubuntu:16.04
ENV foo /bar
WORKDIR ${foo}
ADD .$foo
COPY \$foo /quux

CMD: 컨테이너 생성할 때 실행
CMD["executable", "param1", "param2"]
CMD command param1 param2   ==> /bin/sh -c
CMD ["param1", "param2"]    ==> ENTRYPOINT

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

Dockerfile 에 하나의 CMD 만 가능
여러 CMD 가 있다면 마지막 것만 실행
docker build 시점에 Dockerfile 의 CMD 설정을 오버라이드 가능
ENDPOINT 명령어의 파라미터로 사용될 수도 있음

CMD vs RUN
RUN 은 각 명령을 실행할 때 마다 commit 이 되어 이미지에 레이어가 쌓임.
CMD 는 build 시점에는 실행되지 않음.
CMD 는 컨테이너를 run 할 때 실행.

ENTRYPOINT: 컨테이너를 생성할 때 실행
ENTRYPOINT["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

Dockerfile 에 하나만 가능
여러개 있다면 마지막 것만 실행
docker build 시점에 Dockerfile 의 ENDPOINT 설정을 오버라이드 가능
CMD 명령어에서 파라미터를 받을 수 있음

CMD ["-T"]
ENTRYPOINT["/usr/sbin/sshd"]
docker run <image> -D
==> $ /usr/sbin/sshd -D

WORKDIR
RUN, CMD, ENTRYPOINT, ADD 등을 실행할 directory 를 지정.
Dockerfile 에 여러번 사용 가능.
상대 경로도 사용 가능.
해당 경로가 없으면 생성됨.
docker run 에서 -w 옵션으로 오버라이드 가능.

USER
RUN, CMD, ENTRYPOINT 등을 실행할 유저를 지정.
지정하지 않으면 root 로 실행.
파라미터로 유저 ID 나 UID 를 지정.

VOLUME 호스트와 공유할 directory 설정
VOLUME["/data1", "/data2"]
VOLUME /data1 /data2
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

ADD 컨테이너에 파일 추가
ADD hom* /mydir/
ADD hom?.txt /mydir/

ADD test relativeDir/
ADD test /absoluteDir/
ADD http://example.com/foo.zip /mydir/bar.zip
ADD foo.tar.gz /mydir/
가져올 파일이 변경되면 ADD 명령으로 빌드 캐쉬가 무효화 될 수 있음.
URL 이 인증을 필요로 한다면 사용 불가.
ADD ../test /mydir/ 과 같은 방법으로 Context 외부에서 복사 불가.

COPY 컨테이너에 파일 복사
COPY hom* /mydir/
COPY hom?,txt /mydir/
COPY test relativeDir/
COPY test /absoluteDir/
ADD 와 유사하지만 복사기능만 제공.
압축 해제 같은 복사 외의 기능은 제외.
Context 외부에서 복사 불가.



docker-compose
여러개의 컨테이너를 한번에 올리고 내릴 수 있는 툴.
로컬 개발 환경, 테스트 서버, CI 등의 환경에서 사용하면 편리.
각 애플리케이션에 dockerfile 을 정의하고, 서비스들을 docker-compose.yml 에 설정.
실행 $docker-compose up
정지 $docker-compose stop
$docker-compose ps

docker-compose.yml 의 명령어
image       : 사용할 이미지를 설정
dockerfile  : 서용할 dockerfile 을 지정
command     : 기본 command 를 새로운 값으로 오버라이드
links       : 컨테이너 이름을 설정하면 ip 가 /etc/hosts 에 저장됨
env_file    : 환경변수를 저장한 파일 지정
volumes     : 마운트할 볼륨을 지정
port        : 사용할 포트 설정
dns         : 컨테이너가 사용할 dns 주소 설정


docker login 도커허브에 로그인
docker push thewavelet/sshd
FROM maven:3.2-jdk-7-onbuild
CMD ["do-something-with-built-packages"]
COPY . /usr/src/app
RUN mvn install
docker build -t my-maven .
docker run -it --name my-maven-script my-maven

git clone https://github.com/spring-projects/spring-petclinic.git
cd spring-petclinic/
ls
vi Dockerfile
FROM maven:3.3-jdk-7-onbuild
CMD ["mvn", "tomcat7:run"]
docker build --tag my-spring .
docker run --rm -i -t -p 9966:9966 my-spring

FROM ubuntu:16.04
MAINTAINER your name <your.name@gmail.com>
ENV UPDATED_AT 2017-05-21
RUN apt-get -yqq update
RUN apt-get install -yqq software-properties-common python-software-properties
RUN add-apt-repository ppa:chris-lea/redis-server
RUN apt-get -yqq update
RUN apt-get -yqq install redis-server redis-tools
VOLUME ["/var/lib/redis", "/var/log/redis"]
EXPOSE 6379
CMD []
ENTRYPOINT ["redis-server", "--logfile /var/log/redis/my-redis.log"]

FROM ubuntu:16.04
MAINTAINER your name <your.name@gmail.com>
ENV UPDATED_AT 2017-05-21
RUN apt-get -yqq update
RUN apt-get -yqq install nodejs npm
RUN ln -s /usr/bin/nodejs /usr/bin/node
RUN mkdir -p /var/log/node
ADD mynode /opt/node/
WORKDIR /opt/node
RUN npm install
EXPOSE 8080
CMD ["nodejs", "app.js"]

[mynode]
docker build -t thewavelet/mynode .
docker run -d --name mynode --link myredis:myredis -p 8080:8080 thewavelet/mynode

[myredis]
docker build -t thewavelet/myredis .
docker run -d -h myredis --name myredis -p 6379:6379 thewavelet/myredis



docker-machine ls
docker-machine start <machine name>
docker-machine stop <machine name>
docker-machine env <machine name>
docker-machine ip <machine name>


접속할 때는 192.168.99.101 이나 100 처럼 도커의 ip 주소를 기준으로 host 포트로 접속하면 된다.


* 왠만하면 윈도우 10 home 에서는 docker-machine 을 생성하거나 임의로 조작하는 행위는 하지 말자. 설치된 거만 해도 감사하자.
docker-machine create vdocker -d virtualbox
@FOR /f "tokens=*" %i IN ('docker-machine.exe env --shell cmd') DO @%i
@FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd vdocker') DO %i
SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.99.101:2376
SET DOCKER_CERT_PATH=C:\Users\kdm38\.docker\machine\machines\vdocker
SET DOCKER_MACHINE_NAME=vdocker
REM  @FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd vdocker') DO @%i
VM_STATUS="$(${DOCKER_MACHINE} status ${VM} 2>&1)" to VM_STATUS="$(${DOCKER_MACHINE} status ${VM})" in the file \Docker Toolbox\start.sh,




AWS ECS
IAM 에서 user 생성 후 AdministratorAccess 권한의 그룹이든 정책이든 할당.
access key id, secret access key 를 생성 후 aws configure 에 셋팅. us-west-2 가 orengon 임.
아래는 ECS 콘솔에서 설명을 제공해줌.
aws ecr get-login --region us-west-2 << 이 명령어를 수행하면 주르륵 명령어 나오는데 그걸 다시 콘솔에서 실행.
docker build -t thewavelet .
docker tag thewavelet:latest 445407432785.dkr.ecr.us-west-2.amazonaws.com/thewavelet:latest
docker push 445407432785.dkr.ecr.us-west-2.amazonaws.com/thewavelet:latest
여기서 thewavelet 이 리포지터리 즉, 하나의 이미지임.



클러스터, 태스크, 리포지터리
리포지터리에 이미지 push 하고
태스크에
445407432785.dkr.ecr.us-west-2.amazonaws.com/ngx-charts-material:latest
와 같이 넣고
클러스터는 EC2 에서 AMI ecs 용으로 생성하면 default 로 하나 생기고
거기서 서비스 생성을 누르고 위에 정의한 태스크를 선택하면
EC2 ip 로 접속시 해당 웹페이지 확인 가능.


aws ecs list-clusters
aws ecs describe-clusters
aws ecs create-cluster --cluster-name newcluster
aws ecs help
create-cluster                           | create-service
delete-attributes                        | delete-cluster
delete-service                           | deregister-container-instance
deregister-task-definition               | describe-clusters
describe-container-instances             | describe-services
describe-task-definition                 | describe-tasks
discover-poll-endpoint                   | list-attributes
list-clusters                            | list-container-instances
list-services                            | list-task-definition-families
list-task-definitions                    | list-tasks
put-attributes                           | register-container-instance
register-task-definition                 | run-task
start-task                               | stop-task
submit-container-state-change            | submit-task-state-change
update-container-agent                   | update-container-instances-state
update-service                           | wait







https://hub.docker.com/explore/



[CASSANDRA]
docker pull cassandra:3.11.1
docker run --name cassandra -d -p 9042:9042 cassandra:3.11.1
docker logs -f cassandra
docker exec -it cassandra cqlsh



[ORACLE]
Terminal CLI 환경에서 도커 명령어로 제어해보자.

docker rm oracle11g

description : 해당 이름의 도커 이미지를 삭제합니다.



docker pull sath89/oracle-xe-11g

description : 도커 이미지를 가져옵니다.



docker run --name oracle11g -d -p 8080:8080 -p 1521:1521 -v ~/my/oracle/data:/u01/app/oracle sath89/oracle-xe-11g

description : docker run (도커 컨테이너를 생성 혹은 실행)

--name 옵션으로 컨테이너 이름을 지정

-d  분리된 컨테이너. 백그라운드에서 실행하는 옵션

-p 플래그를 사용하여 호스트포트와 컨테이너포트를 매핑시킵니다. (호스트포트:컨테이너포트)

-v 옵션으로 데이터를 외부에 저장해 공유할 수 있게 해줍니다.

호스트디렉터리:컨테이너디렉터리

(volume의 약자. 이렇게 하면 컨테이너를 종료해도 데이터가 유지됩니다.)

마지막으로 도커허브에 올라와 있는 빌드 이미지 이름을 입력합니다.







기타 참고 명령어

docker logs -f oracle11g

description : 컨테이너 log출력상황을 볼 수 있다.



lsof -PiTCP -sTCP:LISTEN

description : 포트 확인

docker port oracle11g

description : oracle11g 컨테이너 포트 확인



docker exec -it oracle11g sqlplus

description : -it옵션은 콘솔에 결과 출력. sqlplus 실행

컨테이너 내부 프로세스 실행

system/oracle



docker ps

description : 컨테이너 상태 확인



docker stats oracle11g

description : 컨테이너 상태 확인

CONTAINER : 컨테이너명

CPU % : CPU 사용률

MEM USAGE/LIMIT : 메모리 사용량, 컨테이너에서 사용할 수 있는 메모리 제한

MEM % : 메모리 사용률

NET I/O : 네트워크 I/O



docker stop oracle11g

description : 컨테이너 중지

docker restart oracle11g

description : 컨테이너 재시작

docker pause oracle11g

description : 컨테이너 일시정지

docker unpause oracle11g

description : 컨테이너 일시정지 재시작



docker rmi sath89/oracle-xe-11g

description : 도커 이미지 삭제



docker images

description : 도커 이미지 리스트 출력






[REDIS]

set mykey "hello"
get mykey
mset value1 10 value2 20 value3 30
mget value1 value2 value3
set mykey "10"
DECRBY mykey 3
INCRBY mykey 3
DECR mykey
INCR mykey
set mykey "Hello world"
STRLEN mykey

sadd myset "Hello"
sadd myset "World"
sadd myset "World"
smembers myset
scard myset (갯수 cardinality)
srem myset "Hello"
smembers myset
sismember myset "Hello"
sismember myset "World"
sunion key1 key2
sinter key1 key2
sdiff key1 key2
sdiff key2 key1

ZADD myzset 1 "one"
ZADD myzset 1 "uno"
ZADD myzset 2 "two" 3 "three"
ZRANGE myzset 0 -1 WITHSCORES (0 부터 -1 즉, 끝까지 스코어와 함께 다 보여달라.)
ZRANK myzset "two"
ZRANK myzset "one"
ZRANK myzset "uno"
ZSCORE myzset "one"

HMSET myhash field1 "Hello" field2 "World"
HMSET myhash field3 "12345"
HGET myhash field1
HKEYS myhash
HVALS myhash
HDEL myhash field1
HGET myhash field2
HGET myhash field3
HINCRBY myhash field3 2

LPUSH mylist "world"
LPUSH mylist "hello"
LRANGE mylist 0 -1
RPUSH mylist "one"
RPUSH mylist "two"
LPOP mylist
LRANGE mylist 0 -1
LINSERT mylist BEFORE "one" "zero"
LRANGE mylist 0 -1
LSET mylist 0 "minus_one"
LRANGE mylist 0 -1

반응형

'DEV COMMON' 카테고리의 다른 글

Filename is too long  (0) 2022.12.11
임시 이슈  (0) 2022.06.26
rank (order) in database  (0) 2022.03.26
GraphQL 은 문제가 있다... 마음에 들지 않는다...  (0) 2022.03.25
나의링크 삭제 항목 2022-03-23  (0) 2022.03.23

댓글

Designed by JB FACTORY