Docker - 2 (2023.01.17)

최시열·2023년 1월 17일
post-thumbnail

?? 정리해보자

overlay2
Filesystem: extfs
  • docker hub에서 이미지를 pull받을 때 DOCKER OFFICIAL IMAGE라고 인증받은 이미지만 사용할 것!

  • docker search : 이런 이미지가 있구나 참고
  • docker rmi : 이미지 삭제 명령어
  • 각기 다른 도커라면 도커 내부 포트는 같아도 겹치지 않는다
  • docker logs $컨테이너이름

  • 컨테이너는 각자가 아이디를 가지고 있음 (--name을 통해 이름 지정)

  • GiB
    1 M = 1000 KB
    1 Mib = 1024 KB
    3 G = 3000 MB
    3 Gib = 3072 MB

  • 루트계정으로 접속해서 /var/lib/docker의 리스트를 보면 docker에 관련된 디렉터리들을 확인할 수 있다.(buildkit, volumes.. 등등)

  • 컨테이너가 지워지더라도 남겨야하는 DB 등의 경우는 따로 보관해야 한다. (/data에 마운트)


- compose 만들기
curl -SL https://github.com/docker/compose/releases/download/v2.14.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

- compose 권한주기
sudo chmod +x /usr/local/bin/docker-compose

- compose 확인
docker-compose --version

- 레지스트리 운영
docker run -d -p 5000:5000 --restart always --name registry registry:2

docker pull httpd:latest

- 태그 변경
docker tag httpd:latest localhost:5000/httpd:latest

docker push localhost:5000/httpd:latest

- 경로확인
/var/lib/docker/volumes/6999de9b8cbbc4f12e8f46c2dff019f915dc127f0a80f058fc7380a39cf519c0/_data/docker/registry/v2/repositories/httpd
root@node2:/var/lib/docker/volumes/6999de9b8cbbc4f12e8f46c2dff019f915dc127f0a80f058fc7380a39cf519c0/_data/docker/registry/v2/repositories/
mkdir resource

cat > dockerfile

FROM debian
MAINTAINER kwjeon31 <kwjeon31@gmail.com>
run apt-get update; apt-get install -y stress
CMD ["bin/sh", "-c", "stress -c 2"]

docker build -t stress .

docker run -m 100m --memory-swap 100m stress:latest stress --cpu 2 --io 4 --vm-bytes 90m --timeout 1
  • 각 컨테이너의 ip 확인 방법
1. ip addr 로 도커 기본 ip 확인
2. 여러개의 콘솔에서
docker run -it --name c1 busybox
docker run -it --name c2 busybox
docker run -d -p 80:80 --name web1 nginx:latest
로 컨테이너 여러개 실행하기
3. 루트 권한으로 iptables -L -v 을 통해 ip들을 확인하고 개별적으로 docker inspect $컨테이너이름 으로 개별 ip 확인한다.

docker index.html 실습


docker run -d --name web -v /home/guru/workspace/webdata:/var/share/nginx/html -p 80:80 nginx:latest
이때 절대경로로 설정에 주의할 것

curl localhost:80

docker cp ./index.html web:/usr/share/nginx/html

curl localhost:80
index.html의 내용으로 바뀐것을 볼 수 있다.
docker run --name web1 -d -p 80:80 nginx:1.14
docker run --name web2 -d -p 80 nginx:1.14
docker run --name web3 -d  nginx:1.14
위 세개의 컨테이너를 만들고 각각 포트를 확인해 보면
첫번째는 80, 두번째는 임의 적용, 세번째는 없음
  • data
mkdir datashare

cd datashare/

cat > df.sh

#!/bin/bash
mkdir -p /webdata
while true
do
   df -h / > /webdata/index.html
   sleep 10
done

cat > dockerfile

FROM ubuntu:18.04
ADD df.sh /bin/df.sh
RUN chmod +x /bin/df.sh
ENTRYPOINT ["/bin/df.sh"]

docker build -t smlinux/df:latest .

docker run -v /webdata:/webdata -d --name df smlinux/df:latest

docker run -d --name web -v /webdata:/usr/share/nginx/html:ro -p 80:80 nginx:latest
  • mynet에 busybox 만들기
- 네트워크 만들기(mynet)
docker network create --driver bridge --subnet 192.168.100.0/24 --gateway 192.168.100.254 mynet

- busybox 만들고 실행
docker run -it --name c1 --net mynet --ip 192.168.100.100 busybox

ip addr

docker inspect c1에서 mynet에 IPAMConfig에 할당한 ip가 잘 들어있는지 확인
  • server와 client 만들기
- 클라이언트
docker run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql:5.7

- 서버
docker run -p 80:80 -d --name wordpress -e WORDPRESS_DB_PASSWORD=root --link wordpressdb:mysql wordpress
(--link로 서로를 연결)

curl localhost:80

docker exec -it wordpressdb /bin/bash 후
mysql -u root -p 로 mysql 접속 가능
  • compose
cd
mkdir composetest
cd composetest/

cat > app.py
...
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)
...

cat > requierments.txt
...
flask
redis
...

cat > dockerfile
...
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
...

cat > docker-compose.yml
...
version: '3'
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    environment:
      FLASK_ENV: development
  redis:
    image: "redis:alpine"
...

- .yml 파일을 실행한다
docker compose up -d

- 결과 확인하기
curl localhost:5000


docker compose up -d --scale redis=3
profile
최시열

0개의 댓글