[참고 사이트]​

- [Docker] 도커 볼륨 다루기

1. 도커 볼륨

위의 그림에서 보면 컨테이너 계층이미지 계층으로 나누어져 있는 것을 볼 수 있습니다.

 

보통 우리가 도커 이미지를 빌드 할 때 docker build -t app [경로] 명령어를 실행하면 Dockerfile이라는 명세서를 기반으로 도커 이미지가 빌드가 됩니다.

 

이 이미지는 레이어 구조로 되어있는데, Dockerfile 내에 작성되어 있는 여러 명령어들이 순차적으로 레이어가 쌓이듯이 저장된다고 보면 됩니다.

예를 들어, 우분투 이미지를 Base로 사용한다고 하면

 

Layer 1 : Base 우분투 레이어 설치

Layer 2 : 우분투 운영체제에서 필요로 하는 패키지들을 설치(ex. apt-get으로 패키지 설치하는 내용)

Layer 3 : 패키지를 설치(ex. 파이썬 패키지를 설치한다.)

Layer 4 : 소스코드를 복사를 한다면 복사한 내용이 Layer4에 저장(ex. 소스코드의 수정)

Layer 5 : Entrypoint 업데이트(ex. 컨테이너의 Entrypoint를 변경을 한다.)

 

도커 컨테이너와 이미지는 레이어 구조를 취하면서 여러 장점을 가지게 됩니다.

만약, 추후에 이미지에 특정 변경사항을 가한다고 했을 때, 만약 소스코드 상에 변경이 있었다면 Layer 1 ~ Layer 3까지는 변경될 필요가 없습니다.

그러므로, Layer 1 ~ Layer 3까지는 변경을 하지 않고 Layer 4, Layer 5가 생성이 됩니다.

이러한 방식으로 도커 이미지이미지의 여러 버전들이 생긴다고 하더라도 저장 공간을 차지하지 않는 레이어 구조를 가지고 있습니다.

 

이 도커 이미지를 도커 컨테이너로 docker run 명령어로 이미지를 실행하면 컨테이너가 됩니다.

실행한 컨테이너는 두 가지 레이어를 가지게 됩니다.

첫 번째는 이미지 계층(Image Layer), 두 번째는 컨테이너 계층(Container Layer)입니다.

 

  • 이미지 계층(Image Layer)에서 이미지는 항상 동일하고 Read Only(읽기 전용)으로 사용하게 됩니다. 이 읽기 전용 이미지 레이어에는 변경사항을 적용할 수 없습니다.

 

  • 컨테이너 계층(Container Layer)은 컨테이너 상에서 새로운 파일을 쓴다거나 할 때는 기본적으로 Container Layer에 파일을 쓰게 되는데, 이 Container Layer는 Read Write 권한을 가지고 있습니다. 중요한 점은 컨테이너가 종료되고 나면 Container Layer는 컨테이너 종료 시 함께 삭제가 됩니다.

도커 이미지로 컨테이너를 생성하면 이미지는 읽기 전용이 되며 컨테이너의 변경 사항만 별도로 저장해서 각 컨테이너의 정보를 보존합니다. 이미 생성된 이미지는 읽기 전용이므로 어떠한 경우로도 변경되지 않고, 컨테이너 계층에 원래 이미지에서 변경된 파일시스템 등을 저장합니다.

 

이미지에 mysql을 실행하는 데 필요한 애플리케이션 파일이 들어있다면 컨테이너 계층에는 워드프레스에서 쓴 로그인 정보나 게시글 등과 같이 데이터베이스를 운용하면서 쌓이는 데이터가 저장됩니다. 예를 들면, 위에서 생성했던 mysql 컨테이너는 mysql:5.7라는 이미지로 생성됐지만 wordpress 블로그를 위한 데이터베이스 등의 정보는 컨테이너가 갖고 있습니다. 즉, 위의 그림과 같은 구조가 됩니다.

 

그러나, 여기에는 치명적인 단점이 존재합니다. mysql 컨테이너를 삭제하면 컨테이너 계층에 저장되어 있던 데이터베이스의 정보도 삭제된다는 점입니다. 도커의 컨테이너는 생성과 삭제가 매우 쉬우므로 실수로 컨테이너를 삭제하면 데이터를 복구할 수 없게 됩니다. 이를 방지하기 위해 컨테이너의 데이터를 영속성(Persistent) 데이터로 활용할 수 있는 방법이 몇 가지 있습니다. 그중 가장 활용하기 쉬운 방법이 바로 볼륨(Volume)을 활용하는 것입니다.

즉. Docker volume(볼륨)은 컨테이너와 호스트 운영체제 간에 데이터를 공유하거나 저장하기 위한 기능으로, 볼륨을 사용하면 데이터의 지속성을 유지하면서 컨테이너를 생성하거나 삭제할 수 있다. Docker 볼륨은 컨테이너의 파일 시스템이나 디렉토리를 호스트 시스템의 특정 경로와 연결하여 데이터를 저장하고 관리할 수 있도록 해준다.

Docker 볼륨을 사용하는 주요 이점은 다음과 같다.

  • 데이터 지속성 : 컨테이너가 종료되더라도 볼륨에 저장된 데이터는 유지. 이를 통해 컨테이너 재시작, 업데이트, 삭제 등의 작업에서 데이터를 보존할 수 있음.
  • 공유 데이터 : 여러 컨테이너 간에 데이터를 공유하거나 컨테이너와 호스트 간에 데이터를 주고받을 수 있음.
  • 백업 및 복원 : 볼륨을 사용하여 중요한 데이터를 백업하고 필요한 경우 복원할 수 있음.

 

2. 컨테이너 상에서 볼륨을 영구적으로 사용할 수 있는 방법

(1) 호스트 볼륨 공유하기

호스트 볼륨을 이용한다는 것은 호스트 운영체제의 디렉터리를 컨테이너 내에 마운트 시키는 작업을 말하며 가장 간단하고 직관적인 방법입니다.

 

아래 명령어를 입력해서 mysql 데이터베이스 컨테이너를 실행해 줍니다.

# MYSQL 컨테이너 실행 $ docker run -d --name wordpressdb_hostvolume \ -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_DATABASE=wordpress \ -v /home/wordpress_db:/var/lib/mysql \ mysql:5.7

아래 명령어를 입력해서 워드프레스 웹 서버 컨테이너를 생성합니다.

$ docker run -d \ -e WORDPRESS_DB_PASSWORD=password \ --name wordpress_hostvolume \ --link wordpressdb_hostvolume:mysql \ -p 80 \ wordpress

워드프레스 컨테이너에 -p 옵션으로 컨테이너의 80 포트를 외부에 노출했으므로 docker ps 명령어에서 확인한 wordpress_hostvolume 컨테이너의 호스트 포트로 워드프레스 컨테이너에 접속할 수 있습니다.

 

중요한 점은 -v 옵션으로 /home/wordpress_db:/var/lib/mysql로 설정해 준 것입니다.

이는 호스트의 /home/wordpress_db 디렉터리와 컨테이너의 /var/lib/mysql 디렉터리를 공유한다는 뜻입니다.

 

즉, -v 옵션에 [호스트의 공유 디렉터리]:[컨테이너의 공유 디렉터리]를 입력해 주면 됩니다.

 

만약, /home/wordpress_db 디렉터리를 호스트에 생성하지 않았어도 도커는 자동으로 이를 생성해 줍니다.

실제로 데이터베이스 관련 파일이 있는지 확인합니다.

mysql을 구동하는 데 필요한 각종 파일이 공유되었습니다. mysql, performance_schema, sys, wp 디렉터리는 mysql에 존재하는 실제 데이터베이스에 대응됩니다.

 

컨테이너를 삭제하고 데이터베이스의 데이터가 보존되는지 확인합니다. 다음 명령어를 입력해 방금 생성한 두 개의 컨테이너를 삭제합니다.

$ docker stop wordpress_hostvolume wordpressdb_hostvolume $ docker rm wordpress_hostvolume wordpressdb_hostvolume

다시 /home/wordpress_db 디렉터리를 확인하면 mysql 컨테이너가 사용한 데이터가 그대로 남은 것을 확인할 수 있습니다.

-v 옵션을 써서 컨테이너의 디렉터리를 호스트와 공유한 것을 그림으로 나타내면 아래와 같습니다.

컨테이너의 /var/lib/mysql 디렉터리는 호스트의 /home/wordpress_db 디렉터리와 동기화되는 것이 아니라 완전히 같은 디렉터리입니다.

 

위 예시의 경우 원래 호스트에는 /home/wordpress_db 디렉터리가 존재하지 않았습니다. -v 옵션을 사용함으로써 호스트에 /home/wordpress_db 디렉터리가 생성되었고, 이 디렉터리에 파일이 공유되었습니다. 결과적으로 컨테이너의 파일이 호스트로 파일이 복사된 것입니다.

만약, 호스트에 이미 디렉터리와 파일이 존재하고 컨테이너에도 존재한다면 어떻게 될까요?

예를 들면, volume_test라는 이미지가 있고 이 이미지에는 /home/testdir 디렉터리가 존재하고 그 안에 test라는 파일이 존재합니다.

그리고, 아래 명령어를 통해 컨테이너를 생성하고 -v 옵션으로 호스트 볼륨을 공유합니다.

$ docker run -i -t \ --name volume_override \ -v /home/wordpress_db:/home/testdir \ seosh817/volume_test

그러면 -v 옵션의 값인 /home/tesdir 디렉터리를 확인하면 원래 존재했던 test 파일이 없어지고 호스트에서 공유된 파일만 존재하게 됩니다.

즉, 이미지에 원래 존재하던 디렉터리에 호스트의 볼륨을 공유하면 컨테이너의 디렉터리 자체가 덮어씌워집니다. 정확히 말하면 -v 옵션을 통한 호스트 볼륨 공유는 호스트의 디렉터리를 컨테이너의 디렉터리에 마운트 합니다.

또한, 아래처럼 디렉터리 단위의 공유뿐 아니라 단일 파일 단위의 공유도 가능하며 동시에 여러 개의 -v 옵션을 쓸 수도 있습니다.

$ echo hello >> /home/hello && echo hello2 >> /home/hello2 $ docker run -i -t \ --name file_volume \ -v /home/hello:/hello \ -v /home/hello2:/hello2 \ ubuntu:14.04

(2) 볼륨 컨테이너

볼륨 컨테이너를 이용하는 방법은 볼륨을 특정 애플리케이션 컨테이너에서 마운트를 시키는 것이 아니라, 볼륨 컨테이너(위 그림에서 Data-only Container)에서 볼륨 마운트만 진행을 하고 아무것도 하지 않는 컨테이너를 만들어서 애플리케이션 컨테이너가 볼륨 컨테이너를 참조하게 해서 마치 볼륨 컨테이너같이 사용할 수 있습니다. 그러면 Data-only Container의 마운트 목록을 애플리케이션 컨테이너가 공유 받을 수 있습니다.

 

컨테이너를 생성할 때 -v 옵션 대신 --volumes-from 옵션으로 컨테이너를 지정하면 -v 또는 --volume 옵션을 적용한 컨테이너의 볼륨 디렉터리를 공유할 수 있습니다. 이는 직접 볼륨을 공유하는 것이 아닌 -v 옵션을 적용한 컨테이너를 통해 공유하는 것입니다.

 

먼저 호스트 볼륨을 공유하는 volume_override 라는 이름의 컨테이너를 생성해 줍니다. volume_override 컨테이너는 우분투 포칼 이미지를 이용하고 있고 호스트의 $(pwd)/html를 /user/share/nginx/html에 마운트를 하고 있습니다.

$ docker run -d \ -it \ --name volume_override \ -v $(pwd)/html:/usr/share/nginx/html \ ubuntu:focal

그리고 아래 명령어를 입력하여 --volumes-from 옵션을 사용하여 volume_override 컨테이너에서 볼륨을 공유 받는 컨테이너를 생성해 줍니다.

$ docker run -d \ --name seunghwan_nginx1 \ --volumes-from volume_override \ -p 80:80 \ nginx $ docker run -d \ --name seunghwan_nginx2 \ --volumes-from volume_override \ -p 8080:80 \ nginx

docker ps로 확인하면 volume_override, seunghwan_nginx1, seunghwan_nginx2 세 개의 컨테이너가 정상적으로 실행이 된 것을 확인할 수 있습니다.

--volumes-from 옵션을 적용한 컨테이너와 볼륨 컨테이너 사이의 관계를 그림으로 나타내면 위 그림과 같습니다.

여러 개의 컨테이너가 동일한 컨테이너에 --volumes-from 옵션을 사용함으로써 하나의 볼륨을 공유해서 사용할 수 있습니다.

이러한 구조를 활용하여 호스트에서 볼륨만 공유하고 별도의 역할을 하지 않는 일명 '볼륨 컨테이너'로 활용해서 컨테이너를 활용할 수 있습니다. 즉, -v 대신 --volumes-from 옵션을 사용함으로써 볼륨 컨테이너를 연결해 데이터를 간접적으로 공유 받는 방식입니다.

 

docker inspect seunghwan_nginx1를 입력해서 Mounts 목록에 보면 Source와 Destination을 보면

호스트의 /home/ubuntu/html -> 컨테이너의 /usr/share/nginx/html 로 마운트 된 것을 확인할 수 있습니다.

docker exec 명령어로 seunghwan_nginx1 컨테이너에 접속해서 /usr/share/nginx/html에 마운트가 잘 되었는지 확인해 보겠습니다.

docker exec -it bfaf bash

아래 결과를 보시면 정상적으로 마운트가 잘 된 것을 확인할 수 있습니다.

(3) 도커 볼륨

볼륨을 사용하는 세 가지 방법 중 도커 볼륨은 도커에서 제공하는 볼륨 관리 기능입니다.

볼륨을 사용하는 방법 중 보통 호스트 볼륨이나 도커 볼륨을 가장 많이 사용합니다.

호스트 볼륨과의 차이점은 호스트에 마운트 할 경로를 지정했어야 했지만

도커 볼륨도커가 제공하는 볼륨 관리 기능을 통해서 볼륨을 생성하고 삭제하고 관리를 할 수 있습니다.

이렇게 생성된 볼륨은 도커가 관리하는 특정 호스트 경로에 데이터가 저장이 됩니다.

기본적으로는 도커에 데이터가 저장되는 /var/lib/docker/volumes/{...}/_data 에 데이터가 저장되는데

구체적으로는 /var/lib/docker/volumes/volume이름/_data에 도커 디렉터리에 볼륨 이름으로 데이터가 생성되고 데이터가 저장됩니다.

도커 볼륨을 다루는 명령어는 docker volume으로 시작합니다.

docker volume 명령어로 생성한 볼륨은 아래와 같은 구조로 활용됩니다. 도커 볼륨도 마찬가지로 여러 개의 컨테이너에 공유되어 활용될 수 있습니다.

① 도커 볼륨 생성

docker volume create 명령어로 도커 볼륨을 생성할 수 있습니다.

$ docker volume create --name [도커 볼륨 이름]

② 도커 볼륨 목록 확인

docker volume ls 명령어로 생성된 볼륨을 확인할 수 있습니다.

$ docker volume ls

③ 도커 볼륨 정보 확인

docker volume inspect 명령어로 마운트 경로 등의 볼륨 정보를 확인할 수 있습니다.

Driver는 볼륨이 쓰는 드라이버를, Label은 볼륨을 구분하는 라벨을 나타내며, Mountpoint는 해당 볼륨이 실제로 호스트의 어디에 저장됐는지를 의미합니다.

$ docker volume inspect [도커 볼륨 이름]
# myvolume이라는 도커 볼륨 생성 $ docker volume create myvolume # mysql을 실행할 때 도커 볼륨을 /var/lib/mysql에 마운트 $ docker run -d \ --name seunghwan_mysql \ -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_DATABASE=seunghwan_db \ -p 3306:3306 \ -v myvolume:/var/lib/mysql \ mysql:5.7

위의 명령어를 보면 먼저, docker volume create 명령어를 통해서 myvolume이라는 이름의 볼륨을 생성해 줍니다.

그리고 생성한 myvolume 도커볼륨을 mysql 컨테이너를 띄울 때 /var/lib/mysql 컨테이너 경로에다가 마운트 해줍니다.

형식은 아래와 같습니다.

[볼륨의 이름]:[컨테이너의 공유 디렉토리]

* 참고로 /var/lib/mysql 경로는 mysql이 데이터를 쌓는 경로.

mysql이 실행되면서 공유 디렉터리인 컨테이너의 /var/lib/mysql 디렉터리도 같이 초기화가 되고

결국, 도커 볼륨도 같이 공유하므로 ls 명령어로 확인해 보면 마찬가지로 초기화되어 있는 것을 확인할 수 있습니다.

 

seunghwan_mysql 컨테이너가 myvolume 컨테이너를 사용하는지 확인하는 다른 방법은

docker container inspect 명령어를 이용하는 것입니다. docker container inspect 명령어는 컨테이너의 상세한 정보를 출력하는데, 그중 볼륨 마운트에 대한 정보도 포함되어 있기 때문입니다.

Source 항목에 도커 볼륨의 경로가 출력되고, Destination에 공유 디렉터리의 경로가 출력되었습니다.

참고로, 도커 볼륨의 내용물 중 ibdata1을 제거해 주고 실행해 주세요. 제거하지 않으면 아래와 같은 에러가 발생합니다.

발생하는 이유는 mysql 데이터와의 충돌 문제가 발생합니다. 제거해도 어차피 다시 재생성 되므로 안심하고 삭제하셔도 됩니다.

[ERROR] --initialize specified but the data directory has files in it. Aborting. 0 [ERROR] Aborting site:stackoverflow.com

 

출처 : https://blog.naver.com/islove8587/223441448187

728x90
반응형

[참고 사이트]​

- [Docker] Network 명령어 정리

​- [Docker] 도커 네트워크 이해하기

1. 도커 네트워크 명령어 정리

(1) 네트워크 조회

$ docker network ls
  • Docker가 실행되면서 Driver 타입(bridge, host, null) 별로 bridge, host, none 네트워크를 기본 생성한다.
  • 다른 나머지 네트워크는 맥북미니에서 현재 테스트로 생성한 것이다.

(2) 네트워크 생성

$ docker network create my-net

(3) 네트워크 상세 정보

$ docker network inspect my-net [ { "Name": "my-net", "Id": "bc49516c6bdd136d8fdd99141d47fdb8612cc8629e3e087a0f9eb868333aaef0", "Created": "2024-05-04T23:40:41.795429881Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.22.0.0/16", "Gateway": "172.22.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ]

(4) 네트워크 컨테이너 연결

# 실행 중인 컨테이너 연결을 위한 busybox 생성 $ docker run -itd --name=busybox busybox Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox c34182c7a03d: Pull complete Digest: sha256:6776a33c72b3af7582a5b301e3a08186f2c21a3409f0d2b52dfddbdbe24a5b04 Status: Downloaded newer image for busybox:latest 4f2f4cfee6445136666732656bff4bfdb57627f9f69f91370e3488fe59291792 # busybox에 my-net 연결 $ docker network connect my-net busybox # 연결확인 $ docker network inspect my-net | jq '.[0].Containers' { "4f2f4cfee6445136666732656bff4bfdb57627f9f69f91370e3488fe59291792": { "Name": "busybox", "EndpointID": "1cb57652917719b8651691e1347baabff57fe79662a07094de3017cb20e6ef2b", "MacAddress": "02:42:ac:16:00:02", "IPv4Address": "172.22.0.2/16", "IPv6Address": "" } }
  • busybox가 my-net에 정상적으로 연결되었다.
  • busybox는 컨테이너 생성 시 기본 bridge 네트워크에 연결된 상태이다.
  • 이 네트워크에서 busybox를 제거해 보자.

(5) 네트워크 연결 해제

$ docker network disconnect bridge busybox

(6) 네트워크 제거

# 네트워크에 연결된 컨테이너 정지 $ docker stop busybox busybox # 네트워크 삭제 $ docker rm my-net my-net
  • my-net을 제거하기 위해서는 연결된 컨테이너를 정지해야한다.

(7) 네트워크 정리

$ docker network prune WARNING! This will remove all custom networks not used by at least one container. Are you sure you want to continue? [y/N] y Deleted Networks: rocket_default postgres_default aged jenkins-quick-start_default mongodb_default heyform_default
  • 아무 컨테이너도 연결되지 않은 불필요한 네트워크를 한번에 정리할 수 있다.

2. 도커 컨테이너 Port를 외부에 노출

(1) 컨테이너 포트 연결 명령어

$ docker run -p [HOST IP:PORT]:[CONTAINER PORT] [CONTAINER NAME]

-p 옵션 : publish 옵션. 호스트 ip 포트를 Container Port와 매핑시키는 역할을 합니다.

아래의 예제들로 포트연결을 해보겠습니다.

[예제1] nginx 컨테이너의 80번 포트를 호스트의 모든 IP의 80번 포트와 연결하여 실행

$ docker run -d -p 80:80 nginx

위의 명령어는 호스트의 80번 포트와 컨테이너의 80번 포트를 연결합니다.

0.0.0.0:80 -> 80/tcp -> 위의 실행결과에서 Port를 해석하면 모든 호스트 IP의 80번 포트는 컨테이너의 80번 포트로 매핑이 된다는 것을 의미합니다.

curl로 호스트의 80번 포트를 접근해보면 nginx가 출력되는 것을 확인할 수 있습니다.

[예제2] nginx 컨테이너의 80번 포트를 호스트의 사용 가능한 포트와 연결하여 실행

$ docker run -d -p 80 nginx

위의 명령어처럼 80번 포트 하나만 지정을 하면 컨테이너 포트만 지정하는 역할을 합니다.

이렇게 되면, 컨테이너 80번 포트를 호스트의 사용가능한 포트를 랜덤으로 지정하여 연결하게 됩니다.

docker ps로 확인해본 결과 컨테이너의 80번 포트를 호스트의 49153포트로 자동으로 연결이 되었습니다.

마찬가지로 curl localhost:49153로 접근을하면 정상적으로 동작하고 curl localhost:80는 동작하지 않습니다.

[예제3] nginx 컨테이너의 80번 포트를 호스트의 127.0.0.1 IP의 80번 포트와 연결하여 실행

$ docker run -d -p 127.0.0.1:80:80 nginx

위처럼 컨테이너의 IP까지 지정을 해주면 호스트의 해당 IP에 대해서만 포트(여기선 80번 포트)를 매핑하게 됩니다.

 

 

출처 : https://blog.naver.com/islove8587/223441394186

728x90
반응형

[참고 사이트]​

- [Docker] Network, 호스트와 컨테이너의 구조

1. 도커 네트워크 구조

도커 네트워크는 Host, Bridge, Container의 관계이다. 가정 홈 네트워크와 비교하면 더 쉽게 이해할 수 있다. Internet을 여러 장비가 사용하기 위해서는 공유기가 필요하다.

  • eth0

실제 IP가 할당되는 host 네트워크 인터페이스이다. 가정에 제공되는 Internet은 공유기를 통해 다른 장비와 연결된다.

  • docker0

도커가 설치될 때, 기본적으로 구성되는 브리지이다. host 네트워크와 container의 연결을 해주는 역할을 한다. host 네트워크의 제한된 IP를 여러 Container에 공유하는 공유기의 역할을 한다.

  • veth

Container 내부와 연결해 주는 역할을 하는 가상 인터페이스이다. Container가 생성되는 동시에 veth가 생성되며, eth0과 연결되어 외부와의 통신이 가능해 진다. 리눅스의 Virtual Ethernet Interface 을 의미한다.

Internet은 공유기를 통해 나의 맥북에 eth0으로 연결되고, eth0는 docker0에 연결되어 Container와 연결된다.

2. 도커 네트워크 드라이버

(1) 도커 네트워크 종류

도커 네트워크 드라이버는 Native 드라이버와 Remote 드라이버로 나눈다.

  • Native Drivers -> Bridge, Host, None, Overlay를 사용.
  • Remote Drivers -> 써드파티 드라이버로 외부에서 잘 만들어진 드라이버를 사용.

(2) 네트워크 동작 방식에 따라 드라이버 분류

위 그림은 네트워크 드라이버를 단일 호스트, 다중 호스트로 분류를 한 그림이다.

네트워크 드라이버는 단일 호스트에서 동작하는 네트워킹, 다중 호스트에서 동작하는 네트워킹이 있다.

  • 단일 호스트 네트워크 드라이버 -> Bridge, Host, None 네트워크
  • 다중 호스트 네트워크 드라이버 -> Overlay 네트워크

3. 도커 네트워크 드라이버 장단점

(1) Bridge 네트워크

가장 기본적이고 많이 사용되는 도커 네트워크 유형이다. 가상 네트워크를 만들어 컨테이너를 서로 연결하고 각 컨테이너는 네트워크 내에서 고유한 IP 주소를 할당받아 외부와의 통신을 허용한다. Docker의 관점에서 Bridge 네트워크는 동일한 Bridge 네트워크에 연결된 컨테이너가 통신할 수 있도록 하는 동시에 해당 Bridge 네트워크에 연결되지 않은 컨테이너로부터 격리를 제공하는 소프트웨어 Bridge를 사용한다. Docker를 시작하면 Bridge가 자동으로 생성되고, 별도로 지정하지 않으면 컨테이너의 기본 네트워크가 된다.

[장점]

  • 사용 편의성이 뛰어나고 설정이 간단하다.
  • 여러 컨테이너 간 통신에 효과적이다.
  • 네트워크 이름 기반의 명확한 식별 방식을 제공한다.

[단점]

  • 여러 네트워크를 관리해야 할 경우 복잡성이 증가할 수 있다.
  • 네트워크 이름 충돌 문제가 발생할 수 있다.

(2) Host 네트워크

컨테이너가 Host 시스템의 네트워크 네임스페이스와 동일한 네트워크에 속하여, Host 시스템과 동일한 IP 주소를 사용하며, 서로 직접 통신할 수 있다.

[장점]

  • 설정이 매우 간편하다.
  • 컨테이너가 호스트 시스템의 다른 프로세스와 쉽게 통신할 수 있도록 한다.
  • 성능이 빠르다.

[단점]

  • 네트워크 격리가 불가능하다.
  • 보안 위험이 증가한다.
  • 호스트 시스템의 네임스페이스를 변경할 수 있다.

[사용 사례]

  • 호스트 시스템과 긴밀하게 통합되어야 하는 컨테이너
  • 신뢰할 수 있는 개발 환경
  • 성능이 중요한 시나리오

(3) None 네트워크

네트워크 기능을 제공하지 않는 가벼운 네트워크 유형이다.

컨테이너는 서로 직접 통신할 수 없으며, 외부 네트워크에 액세스할 수도 없다.

[장점]

  • 리소스 사용량이 매우 적다.
  • 네트워크 보안을 강화한다.
  • 분리된 작업 공간을 제공한다.

[단점]

  • 컨테이너 간 통신이 불가능하다.
  • 외부 네트워크 액세스가 불가능하다.
  • 사용 상황이 제한적이다.

[사용 사례]

  • 민감한 데이터를 처리하는 컨테이너
  • 네트워크 격리가 필수적인 시나리오
  • 임시 작업 공간

(4) Container 네트워크

하나의 컨테이너의 네트워크 네임스페이스를 다른 컨테이너에 연결하여 서로 직접 통신할 수 있다.

하지만, 외부 네트워크에는 액세스할 수 없다.

[장점]

  • 강력한 네트워크 격리를 제공한다.
  • 특정 컨테이너 그룹 간의 통신을 제어할 수 있다.
  • 유연한 네트워킹 구성이 가능하다.

[단점]

  • 설정이 다소 복잡할 수 있다.
  • 여러 컨테이너를 연결해야 할 경우 관리가 어려울 수 있다.

[사용 사례]

  • 바인딩된 컨테이너의 테스트를 하는 경우 유용하다.

(5) Overlay 네트워크

Overlay 네트워크는 여러 Docker 데몬 호스트 간에 분산 네트워크를 생성한다.

[장점]

  • 여러 호스트에 분산된 컨테이너의 통신을 가능하게 한다.
  • 확장성 : 네트워크 인프라를 확장할 수 있다.
  • 유연성 : 다양한 네트워크 레이어를 도입하여 연연하게 구성 및 관리를 할 수 있다.

[단점]

  • 복잡성 : 기존 브릿지 네트워크에 비해 설정 및 관리가 복잡하다.
  • 성능 : 추가적인 네트워크 레이어를 도입하여 성능 저하가 발생할 수 있다.
  • 호환성 : 모든 네트워킹 환경과 호환되지 않아 추가적인 해결 작업이 필요할 수 있다.

[사용 사례]

  • 마이크로서비스 아키텍처 : MSA에서 컨테이너 간 통신 및 네트워크 격리를 지원한다.
  • 멀리 클라우드 환경 : 여러 클라우드 환경에 분산 배포하고 통신하도록 지원가능하다.

 

출처 : https://blog.naver.com/islove8587/223441374772

728x90
반응형

[참고 사이트]​

- 도커 컨테이너 - 라이프사이클 및 명령어

1. 도커 컨테이너의 라이프사이클

[도커 컨테이너의 라이프사이클과 관련 명령어]

도커 이미지가 컨테이너로 생성될 때의 라이프 사이클은 위의 그림과 같습니다.

도커 컨테이너 생성부터 종료까지 생명주기별로 다루어보겠습니다.

2. 명령어

(1) 도커 컨테이너 생성

docker create 명령어는 받은 도커 이미지를 컨테이너로 생성합니다.

$ docker create [image]

docker create 명령어를 입력하면, 도커 엔진이 로컬 호스트에서 이미지 정보를 찾아서 컨테이너를 생성합니다. 정상적으로 수행되면 도커 엔진이 생성한 컨테이너의 해쉬값을 반환합니다.

만약, 로컬 호스트에 이미지가 없을 경우에는 도커 엔진이 자동으로 docker pull을 실행하여 Docker Repoistory에서 이미지를 가져오는 것을 시도합니다.

(2) 도커 컨테이너 시작

① 컨테이너 시작

- docker start 명령어는 도커 컨테이너를 시작합니다. 도커 컨테이너가 생성되어 있어야 합니다.

$ docker start [container]

② 컨테이너 생성 후 시작

- docker run 명령어는 컨테이너 docker create와 docker start를 모두 실행합니다.

# 옵션 $ docker run [option] [image] [command] [args] # 생략 $ docker run [image]

docker run도 docker create와 마찬가지로 로컬 도커 엔진에 이미지가 존재하지 않을 경우 도커 중앙 이미지 저장소인 도커 허브에서 자동으로 이미지를 내려받습니다.

  • -i 옵션 -> 컨테이너와 상호(interactive) 입출력을 가능하게 합니다. 호스트의 표준 입력(stdin)과 컨테이너의 표준입력을 연결함. ex) 컨테이너에서 실행되는 어플리케이션이 키보드 입력을 필요로 할 경우 이 옵션을 통해 호스트에서 주는 키보드 입력을 컨테이너로 전달될 수 있도록 설정.

  • -t 옵션 -> tty를 할당합니다. 터미널 명령을 정상적으로 실행할 수 있도록 설정. (즉, -i와 -t는 셸을 실행하는 용도) ex) -t 옵션으로 tty를 활성화 시켜서 bash 쉘을 사용하도록 컨테이너를 설정해 줄 수 있음.

-i와 -t 옵션 둘 중 하나라도 사용하지 않으면 쉘을 정상적으로 사용할 수 없습니다.

# 백그라운드에서 알아서 동작하는 어플리케이션과 달리 표준 입력을 필요로 하는 어플리케이션인 경우 사용. $ docker -i -t ubuntu:focal # 종료. $ exit # 앱은 종료하지 않고 터미널만 빠져나오기. ctrl + p, q 입력
  • --rm 옵션 -> 컨테이너가 실행 종료될 경우 이미지 자동으로 삭제

  • -d 옵션 -> detached 모드로 실행. 컨테이너가 background에서 데몬형태로 동작하도록 설정. (기본적으로는 Foreground에서 동작) -it가 컨테이너 내부에 attached 모드로 진입 했던 것과는 반대.

  • --name 옵션 -> 컨테이너의 이름을 설정. 옵션을 생략하면 데몬에서 자동으로 부여.
  • -p 옵션 -> 호스트 운영체제와 컨테이너 사이의 포트를 바인딩하기 위한 옵션
$ docker run -p 80:80 -d nginx
  • -v 옵션 -> 호스트 운영체제와 컨테이너 사이의 파일시스템 디렉토리를 마운트하기 위한 옵션(추후에 도커 볼륨 포스트에서 다룰 예정)

(3) 도커 컨테이너 종료

① 컨테이너 종료

- docker stop 명령어는 컨테이너를 안전하게 종료합니다.

$ docker stop [container]

② 컨테이너 강제 종료

- docker kill 명령어는 컨테이너를 강제 종료합니다.

$ docker kill [container]

③ 모든 컨테이너 종료

# $()는 명령어의 결과를 전달 $ docker stop $(docker ps -a -q)

(4) 도커 컨테이너 목록 확인하기

① 실행중인 컨테이너 상태 확인

- docker ps 명령어는 실행중인 컨테이너의 상태를 확인할 수 있습니다.

$ docker ps

② 전체 컨테이너 상태 확인

- docker ps 명령어에 -a 옵션을 주면 모든 컨테이너의 상태를 확인할 수 있습니다.

$ docker ps -a

③ 컨테이너 상세 정보 확인

$ docker inspect [container]

(5) 도커 컨테이너 삭제

① 컨테이너 삭제

- docker rm 명령어는 컨테이너를 삭제합니다. 실행중인 컨테이너는 삭제할 수 없습니다.

$ docker rm [container]

② 컨테이너 강제 종료 후 삭제

- 만약 컨테이너가 실행중이라면 -f 옵션을 이용하여 강제 종료 후 삭제할 수 있습니다.

$ docker rm -f [container]

③ 모든 컨테이너 종료 후 삭제

## $()는 명령어의 결과를 전달 $ docker rm -f $(docker ps -a -q)

④ 컨테이너 실행 종료 후 자동 삭제

$ docker run --rm [container]

⑤ 중지된 모든 컨테이너 삭제

- docker container prune 명령어로 중지된 모든 컨테이너를 삭제할 수 있습니다.

$ docker container prune
 
 

출처 : https://blog.naver.com/islove8587/223437889208

728x90
반응형

[참고 사이트]​

- [도커 스터디#2] 개발환경 세팅 및 배포 실습

- Rocky Linux 9 에서 Docker 설치하기

1. 우분투(Ubuntu 20.04.6 LTS)에 Docker 설치

(1) Docker Engine 설치

시스템 패키지 업데이트

ubuntu@ubuntu:~$ sudo apt-get update

② 필요한 패키지 설치

ubuntu@ubuntu:~$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  • apt-transport-https : 패키지 관리자가 https를 통해 데이터 및 패키지에 접근할 수 있도록 한다.
  • ca-certificates : ca-certificate는 certificate authority에서 발행되는 디지털 서명. SSL 인증서의 PEM 파일이 포함되어 있어 SSL 기반 앱이 SSL 연결이 되어있는지 확인할 수 있다.
  • curl : 특정 웹사이트에서 데이터를 다운로드 받을 때 사용
  • gnupg-agent : GnuPG key를 관리하는 agent
  • software-properties-common : *PPA를 추가하거나 제거할 때 사용한다.

③ Docker의 공식 GPG키를 추가

ubuntu@ubuntu:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

[curl 명령어의 옵션]

  • f : HTTP 요청 헤더의 contentType을 multipart/form-data로 보낸다.
  • s : 진행 과정이나 에러 정보를 보여주지 않는다.(–silent)
  • S : SSL 인증과 관련있다고 들었는데, 정확히 아시는 분 있다면 댓글 부탁!
  • L : 서버에서 301, 302 응답이 오면 redirection URL로 따라간다.
  • apt-key : apt가 패키지를 인증할 때 사용하는 키 리스트를 관리한다. 이 키를 사용해 인증된 패키지는 신뢰할 수 있는 것으로 간주한다. add 명령어는 키 리스트에 새로운 키를 추가하겠다는 의미이다.

④ Docker의 공식 apt 저장소(repository)를 추가

ubuntu@ubuntu:~$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  • add-apt-repository : PPA 저장소를 추가해준다. apt 리스트에 패키지를 다운로드 받을 수 있는 경로가 추가된다.

⑤ 시스템 패키지 업데이트

ubuntu@ubuntu:~$ sudo apt-get update

⑥ Docker 설치

ubuntu@ubuntu:~$ sudo apt-get install docker-ce docker-ce-cli containerd.io

⑦ 설치된 Docker 버전 확인

ubuntu@ubuntu:~$ docker --version Docker version 26.1.1, build 4cf5afa

⑧ Docker 설치 확인

ubuntu@ubuntu:~$ sudo systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2024-05-02 07:50:55 UTC; 12s ago ...

⑨ Docker 실행

자동 설치 스크립트로 다운받았던 사람들은 hello-world 이미지 파일이 이미 있으니 다시 다운 받지 않아도 된다.

  • docker pull은 도커 허브 사이트에서 이미지 파일을 가져온다.
ubuntu@ubuntu:~$ sudo docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world c1ec31eb5944: Pull complete Digest: sha256:a26bff933ddc26d5cdf7faa98b4ae1e3ec20c4985e6f87ac0973052224d24302 Status: Downloaded newer image for hello-world:latest docker.io/library/hello-world:latest
  • 내 시스템에 어떤 이미지들이 있는지 확인하려면 docker images를 활용
ubuntu@ubuntu:~$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d2c94e258dcb 12 months ago 13.3kB
  • 컨테이너 실행
ubuntu@ubuntu:~$ sudo docker run hello-world Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
  • 컨테이너 확인하기
ubuntu@ubuntu:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7012affd3ff3 hello-world "/hello" 25 seconds ago Exited (0) 25 seconds ago blissful_tesla
  • 컨테이너 삭제
ubuntu@ubuntu:~$ sudo docker rm 7012affd3ff3

(2) Docker Compose 설치

① 도커 컴포즈 설치

ubuntu@ubuntu:~$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

도커 컴포즈 권한 부여

ubuntu@ubuntu:~$ sudo chmod +x /usr/local/bin/docker-compose

심볼릭 링크 연결

ubuntu@ubuntu:~$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

버전 확인

ubuntu@ubuntu:~$ docker-compose --version Docker Compose version v2.27.0

2. 로키(Rocky Linux 9.3)에 Docker 설치

(1) Docker Engine 설치

① 시스템 패키지 업데이트

[rocky@localhost ~]$ sudo dnf -y update

② Docker의 공식 dnf 저장소(repository)를 추가

[rocky@localhost ~]$ sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

③ Docker 설치

[rocky@localhost ~]$ sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin

④ Docker 서비스 시작 및 활성화

[rocky@localhost ~]$ sudo systemctl --now enable docker

⑤ 설치된 Docker 버전 확인

[rocky@localhost ~]$ docker --version Docker version 26.1.1, build 4cf5afa

⑥ Docker 설치 확인

[rocky@localhost ~]$ sudo systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled) Active: active (running) since Thu 2024-05-02 17:18:25 KST; 10s ago ...

⑦ Docker 실행

  • docker pull은 도커 허브 사이트에서 이미지 파일을 가져온다.
[rocky@localhost ~]$ sudo docker pull hello-world Using default tag: latest latest: Pulling from library/hello-world c1ec31eb5944: Pull complete Digest: sha256:a26bff933ddc26d5cdf7faa98b4ae1e3ec20c4985e6f87ac0973052224d24302 Status: Downloaded newer image for hello-world:latest docker.io/library/hello-world:latest
  • 내 시스템에 어떤 이미지들이 있는지 확인하려면 docker images를 활용
[rocky@localhost ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest d2c94e258dcb 12 months ago 13.3kB
  • 컨테이너 실행
[rocky@localhost ~]$ sudo docker run hello-world Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
  • 컨테이너 확인하기
[rocky@localhost ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ed75eefc79ef hello-world "/hello" 46 seconds ago Exited (0) 45 seconds ago gallant_keldysh
  • 컨테이너 삭제
[rocky@localhost ~]$ sudo docker rm ed75eefc79ef

(2) Docker Compose 설치

① 도커 컴포즈 설치

[rocky@localhost ~]$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

도커 컴포즈 권한 부여

[rocky@localhost ~]$ sudo chmod +x /usr/local/bin/docker-compose

심볼릭 링크 연결

[rocky@localhost ~]$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

버전 확인

[rocky@localhost ~]$ docker-compose --version Docker Compose version v2.27.0
 
 

출처 : https://blog.naver.com/islove8587/223434272414

728x90
반응형

[참고 사이트]​

- 윈도우 Docker 설치 완벽 가이드(Home 포함)

1. Windows Home과 Pro에서 Docker 설치 차이 이해하기

먼저 Windows에서 Docker를 설치하기에 앞서서 본인이 사용중인 Windows가 어떤 에디션인지 확인할 필요가 있습니다.

① Windows + S를 입력하고, 검색 창에서 PC 정보를 검색합니다.

② 오른쪽의 정보 창에서 스크롤해서 내려가면 Windows 10 에디션을 확인할 수 있습니다. 예시의 이미지에서는 Windows 10 Pro를 사용중인 것을 알 수 있습니다.

Docker를 사용할 때 Windows Home Edition과 Windows Pro Edition의 가장 큰 차이는 Hyper-V 기능의 지원여부입니다.

Windows 10/11 Professional / Education / Enterprise 에디션

  • WSL2 기반 Docker Engine 사용 가능
  • Hyper-V 기반 Docker Engine 사용 가능

Windows 10/11 Home 에디션

  • WSL2 기반 Docker Engine 사용 가능

Home 에디션의 경우 Docker를 사용하려면 WSL2가 필수이며, Pro 사용자의 경우 WSL2를 사용하지 않더라도 Hyper-V 기반 가상화를 사용해 Docker Engine을 사용하는 것이 가능합니다.

WSL2에 대한 자세한 설명은 '[윈도우즈/WSL] WSL(Windows Subsystem for Linux) 2 설치' 포스트를 참조하세요.

2. Docker Desktop 다운로드 및 설치 방법

① 다음 페이지로 이동해서 Download for Windows를 클릭해 Docker Desktop for Windows를 다운로드 받습니다.

- Docker Desktop for Mac and Windows | Docker

② 다운로드 받은 Docker Desktop Installer.exe를 실행하면 사용자 계정 컨트롤이 나타납니다. 설치를 진행하려면 ’예’를 클릭합니다.

③ 안내에 따라 설치를 진행합니다. 설치 중간에 Configuration이 나타납니다. 체크하고 설치를 진행합니다(옵션은 바탕화면에 아이콘 추가할지 여부입니다).

④ Docker Desktop 설치가 진행됩니다. 몇 분 정도 시간이 걸리니 완료될 때까지 기다립니다.

⑤ 설치가 끝나면 Installation succeeded 메시지가 나타납니다. 시스템 상태에 따라서 재시작이나 로그아웃을 해야하는 경우도 있습니다. Close 버튼을 클릭해 인스톨러를 종료합니다.

⑥ 이제 바탕화면의 Docker Desktop 아이콘이나 Windows + S로 Docker를 검색해서 Docker Desktop을 실행할 수 있습니다. Docker Desktop을 실행합니다.

⑦ 시스템에 WSL2가 활성화되어있다면 Docker는 기본적으로 WSL2를 백엔드로 Docker Engine을 실행합니다. 초기 셋업에는 몇 분 정도의 시간이 걸립니다. 성공적으로 Docker가 실행되면 Tutorial이 나타납니다.

⑧ 이후 셋업이 완료되고, Docker Desktop을 실행하면 아래와 같은 창이 열리는데, 오른쪽 상단에 톱니바퀴 모양 환경설정을 클릭합니다

General 설정에서 Use the WSL 2 based engine에 체크가 되어있는지 확인합니다. 미리 체크가 되어있을 텐데, 안됐다면 체크하고 오른쪽 아래의 Apply & Restart 버튼을 클릭합니다.

⑨ 다음으로 Resource > WSL Integration 메뉴로 이동하여 Enable Integration with my default WSL distro에 체크되어있는지 확인하고 Apply & Restart 버튼을 클릭해주면 도커 엔진이 재실행됩니다.

3. Docker 설치 확인 및 간단한 nginx 서버 예제 실행해보기

여기서는 Windows Terminal을 열어서 정상 동작하는지 간단하게 테스트 해보겠습니다. PowerShell 탭을 하나 열고 wsl 명령어로 Docker 전용 머신이 실행중인 것을 확인할 수 있습니다.

PS C:\Users\islove8587> wsl -l -v
NAME                   STATE           VERSION
* Ubuntu_20.04.6_LTS     Stopped         2 
  docker-desktop         Running         2
  docker-desktop-data    Running         2

wsl로 docker-desktop 리눅스에 명령어를 실행해볼 수 있습니다.

docker-desktop은 BusyBox가 포함된 LinuxKit 기반의 경량 리눅스인 것을 확인해볼 수 있습니다.

PS C:\Users\islove8587> wsl -d docker-desktop busybox
BusyBox v1.36.1 (2023-11-07 18:53:09 UTC) multi-call binary.
...

docker version 명령으로 Docker 서버와 클라이언트 정보를 확인해봅니다.

PS C:\Users\islove8587> docker version
Client:
 Cloud integration: v1.0.35+desktop.13
 Version:           26.0.0
 API version:       1.45
...

Server: Docker Desktop 4.29.0 (145265)
 Engine:
  Version:          26.0.0
  API version:      1.45 (minimum version 1.24)
...

기본적으로 윈도우와 맥의 경우 도커를 설치할 때 같이 도커 컴포즈가 설치되기 때문에 설치가 잘 되었는지 확인하는 작업만 진행합니다.

PS C:\Users\islove8587> docker-compose version
Docker Compose version v2.26.1-desktop.1

docker ps로 실행중인 컨테이너를 확인해봅니다.

PS C:\Users\islove8587> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

아직 아무것도 실행중이지 않은 것을 확인할 수 있습니다. 여기서부터는 nginx 이미지로 간단한 서버 테스트를 해보겠습니다. 먼저 웹 브라우저를 열어 127.0.0.1:4567에 접속해봅니다. 다음과 같이 사이트에 접속을 할 수 없는 상태인 것을 확인합니다.

docker run 명령어로 nginx 이미지 기반 컨테이너를 하나 실행해봅니다.

PS C:\Users\islove8587> docker run -p 4567:80 -d nginx:latest
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
b0a0cf830b12: Pull complete
8ddb1e6cdf34: Pull complete
5252b206aac2: Pull complete
988b92d96970: Pull complete
7102627a7a6e: Pull complete
93295add984d: Pull complete
ebde0aa1d1aa: Pull complete
Digest: sha256:ed6d2c43c8fbcd3eaa44c9dab6d94cb346234476230dc1681227aa72d07181ee
Status: Downloaded newer image for nginx:latest
d25f302159a62e9a85cb4ad64eaa88fe88c794012d7ce89d576d31ae556cc1b0

Docker에서는 이미지를 자동으로 다운로드 받고 실행해줍니다. docker ps로 실행한 컨테이너를 확인합니다.

PS C:\Users\islove8587> docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS                  NAMES
d25f302159a6   nginx:latest   "/docker-entrypoint.…"   50 seconds ago   Up 46 seconds   0.0.0.0:4567->80/tcp   lucid_joliot

다시 웹 브라우저에서 127.0.0.1:4567에 접속해보면, 이제 ‘Welcome to nginx!’ 메시지가 나타납니다.

사용하지 않는 컨테이너는 docker rm 명령어로 삭제해줍니다. d25f302159a6는 docker ps에서 확인할 수 있는 컨테이너 ID(CONTAINER ID)입니다.

PS C:\Users\islove8587> docker rm -f d25f302159a6
 
 

 

 

출처 : https://blog.naver.com/islove8587/223434132894

728x90
반응형

+ Recent posts