Amazone-linux 에서 docker

진성대·2023년 9월 28일
0

Docker

목록 보기
4/12

Amazon LinuxAmazon Web Services (AWS)에서 제공하는 Linux 배포판입니다. Amazon Linux는 주로 CentOSFedora와 유사한 RHEL (Red Hat Enterprise Linux) 계열에 기반을 두고 있습니다.

  • Amazon Linux에서는 apt 대신 yum 패키지 관리자를 사용합니다.
  • 최근에는 Amazon Linux 2에서 yum의 차세대 버전인 dnf도 사용할 수 있지만, 대부분의 경우 yum을 사용하여 작업을 수행합니다.

패키지를 업데이트하려면:

sudo yum update

따라서, Amazon Linux에서는 apt 대신 yum을 사용하여 패키지 관리 작업을 수행합니다.

  sudo yum -y install \
> apt-transport-https \
> ca-certificates \
> curl \
> gnupg-agent \
> software-properties-common
  • Amazon Linux에서는 위의 명령어에서 요청한 일부 패키지들이 기본적으로 제공되지 않습니다.
  • 그 이유는 Amazon Linux가 Debian/Ubuntu 계열이 아니라 RHEL/CentOS 계열에 기반을 두고 있기 때문입니다.
  • 따라서 apt-transport-https, gnupg-agent, software-properties-common와 같은 패키지들은 주로 Debian/Ubuntu와 같은 배포판에서 사용됩니다.

다음은 문제 해결 방법입니다:

  1. apt-transport-https: Amazon Linux에서는 apt 패키지 관리자를 사용하지 않기 때문에 이 패키지는 필요하지 않습니다.

  2. gnupg-agent: GnuPG 에이전트에 관련된 패키지를 설치하려면:

sudo yum install gnupg2
  1. software-properties-common: 이 패키지는 Debian/Ubuntu에서 PPA 저장소를 추가하기 위한 도구를 제공합니다. Amazon Linux에서는 이에 대응하는 패키지가 따로 없습니다.

Docker 기본 설치 Package들

sudo yum -y install \
ca-certificates \
curl \
gnupg2

Amazon Linux 2에서는 아래와 같이 Docker를 직접 설치할 수 있습니다.

sudo yum install docker
sudo service docker start
sudo usermod -a -G docker ec2-user

마지막 명령어는 ec2-user를 docker 그룹에 추가하여 Docker 명령어를 sudo 없이 실행할 수 있게 합니다. 그런 다음, 로그아웃하고 다시 로그인하여 변경 사항을 적용합니다.

sudo systemctl enable docker 
  • 자동 시작 설정: 이 명령은 시스템 부팅 시 Docker 서비스가 자동으로 시작되도록 설정합니다.
  • 따라서 시스템이 재시작되더라도 Docker 컨테이너 및 서비스는 자동으로 실행됩니다.
  • systemd는 서비스를 관리하기 위해 symbolic link를 사용합니다.
  • systemctl enable 명령은 /etc/systemd/system/ 디렉토리 내에 해당 서비스를 시작하기 위한 symbolic link를 생성합니다.
  • 이 명령을 실행하지 않으면, 시스템이 재부팅될 때마다 사용자는 수동으로 sudo systemctl start docker를 실행하여 Docker 서비스를 시작해야 합니다.
  • sudo systemctl enable docker를 사용하면 이런 수동 작업을 피할 수 있으며, 시스템 시작 시 Docker가 자동으로 실행되도록 할 수 있습니다.

Dockeer 에서 제공하는 shellscript로 docker engine설치

#docker 에서 제공하는 shell script를 이용한 자동 설치
~$ curl -fsSL https://get.docker.com -o get-docker.sh

# shell script 내용 확인 후 변경 가능
~$ sudo vi get-docker.sh

# 실행 권한 부여
~$ chmod +x get-docker.sh

# 설치
~$ sudo sh get-docker.sh

docker Image 삭제

~$ dpkg -l | grep -i docker

~$ sudo apt-get purge -y docker.io
~$ sudo apt-get autoremove -y --purge docker.io
~$ sudo apt-get autoclean
~$ sudo apt purge docker-ce

# Host에 image, directory, 볼륨, 또는 사용자 생성 구성 파일을 제거
~$ sudo rm /etc/apparmor.d/docker
~$ sudo rm -rf /var/lib/docker
~$ sudo groupdel docker
~$ sudo apt-get purge docker-engine
~$ sudo apt-get autoremove --purge docker-engine

gVisior

gVisor는 구글에서 개발한 경량화된 컨테이너 런타임으로, 컨테이너를 위한 추가적인 격리를 제공하여 보안을 강화합니다. 전통적인 컨테이너 (예: Docker 컨테이너)는 호스트 시스템의 리소스를 직접적으로 공유하는 반면, gVisor는 컨테이너화된 애플리케이션 사이와 호스트 시스템 사이에 격리 계층을 추가합니다.

주요 특징 및 특성

  • 경량화된 커널: gVisor는 그 자체로 경량화된 커널을 가진다. 이 커널은 실제 리눅스 커널이 아니지만, 애플리케이션에게는 그렇게 보이며, 이러한 방식으로 시스템 호출을 가로채고 처리한다.

  • 보안: gVisor는 호스트 시스템과 애플리케이션 간의 추가적인 격리를 제공하여 potable hole이라고 불리는 보안 취약점을 방지합니다.

  • 호환성: gVisor는 대부분의 리눅스 시스템 호출을 지원하므로, 많은 애플리케이션들이 변경 없이 그대로 실행될 수 있습니다.

  • 성능: gVisor는 추가적인 격리 계층을 제공하기 때문에 일부 시나리오에서는 전통적인 컨테이너보다 약간의 오버헤드가 발생할 수 있습니다.

  • 통합성: gVisor는 Docker 및 Kubernetes와 같은 표준 컨테이너 툴체인과 통합될 수 있습니다.

간단히 말해서, gVisor는 컨테이너화된 애플리케이션의 보안을 강화하기 위해 개발된 도구로, 기존의 컨테이너 런타임과 비교하여 높은 수준의 격리를 제공합니다.


  • 설치된 image에 들어가서 ifconfig 명령어를 사용하면 순차적으로 ip가 배정된다.
  • xxx.xxx.xx.1 은 docker 자체 ip (얘를 gateway로 사용한다. 나머지 실행되는 container들은 순차적으로 ip할당)
docker inspect sys-container-1 | grep -i ipaddress
docker inspect sys-container-1 | grep -i ipaddress

docker container ip Address 확인하는 명령어


veth48c1a3f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::70fa:1eff:feb6:4272  prefixlen 64  scopeid 0x20<link>
        ether 72:fa:1e:b6:42:72  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10  bytes 796 (796.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vethbb7f4f9: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::b4e6:84ff:fe83:733b  prefixlen 64  scopeid 0x20<link>
        ether b6:e6:84:83:73:3b  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 16  bytes 1268 (1.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • virtual Ethernet lxc 커널이 가지고 있는 기술중 하나로 네임스페이스가 있는데 그 네임스페이스에 의해 만들어진 터널링 같은 서비스
    그래서 ip가 없다. docker-zero와 container사이에 존재하는 터널
  • 컨테이너 개수만큼 만들어진다 (pair 형식으로)

리눅스의 LXC란??


[ec2-user@ip-172-31-36-185 ~]$ docker run -d -p 8001:80 --name=webserver1 nginx:1.25.0-alpine
  • 0.0.0.0(world or 외부)에서 들어오는 모든 ip에서 8001번으로 패킷을 전달하면 이 패킷은 컨테이너 내부에 80 port로 전달한다.

이를 누가 연결해주는가??

docker-proxy

  • NAT, NAPT 기술을 가지고 있다.

SCP

  • server to server 원격 카피 cmd
  • 와 비슷 하게 docker 에서도 server to server 로 원격 카피 하는 명령어가 있다.
mkdir LABs && cd $_
vi index.html
docker cp index.html webserver1:/usr/share/nginx/html/index.html

앞서 수행한 실습의 웹소스 (index.html)를 보유한 이미지를 만들고 싶다면?

vi Dockerfile
FROM nginx:1.25.0-alpine
COPY index-image.html /usr/share/nginx/html/index.html
COPY docker_logo.png /usr/share/nginx/html/docker_logo.png
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

docker build -t myweb:v1.0 .
docker images
docker run -d -p 8002:80 --name=my-webserver2 myweb:v1.0

CMD ["nginx", "-g", "daemon off;"]

  • image 에서 container로 변경되면 정적 -> 동적
  • 동적환경에서 핵심은 container 자체에서 프로세스가 동작한다는게 핵심
  • nginx Application container는 nginx daemon 자체가 그 컨테이너의 주인이기 때문에 반드시 nginx daemon이 켜져야 한다.
  • 그래서 CMD 키워드는 대부분 실행 명령어가 들어간다.

데이터베이스 컨테이너 생성 실습

새로운 base image를 사용하는 경우에는 hub.docker.com에서 해당 이미지를 찾아 설명을 읽고 사용하는 것을 권장한다.

Mysql

~$ docker pull mysql:5.7-debian
~$ docker images
~$ docker run -it -e MYSQL_ROOT_PASSWORD=pass123# mysql:5.7-debian /bin/bash

root@~~~:/# cat /etc/os-release
root@~~~:/# /etc/init.d/mysql start

## 종료된 mysql docker container에 다시 들어가는법
docker start (container id or name)
docker exec -it (container id or name) bash

## container 가 꺼졌기 떄문에 mysql 다시 재실행
/etc/init.d/mysql start
mysql -uroot -p

mariadb

~$ docker run --name mariadb -e MYSQL_ROOT_PASSWORD=sjin -d \
> -e MARIADB_DATABASE=item -p 3306:3306 mariadb:10.2

~$ docker ps

~$ docker exec -it mariadb /bin/bash
root@~~~~:/# service mysql start
root@~~~~:/# mysql -uroot -p

GUI 컨테이너 관리도구 Portainer

  • 웹 GUI 기반의 docker 컨테이너 관리도구, portainer
    • Potainer CE 는 Docker, Swarm, Kubernetes 및 ACI 환경을 관리하는 데 사용할 수 있는 컨테이너화된 애플리케이션을 위한 경량 서비스 제공 플랫폼이다.
    • 배포와 사용이 간단하게 설계되었고, 이 애플리케이션을 통해 'Smart' GUI 및 광범위한 API를 통해 docker에서 사용되는 대부분의 리소스(컨테이너, 이미지, 볼륨, 네트워크 등)를 관리할 수 있다.

portainer 링크 : portainer.io

Portainer 컨테이너 생성

docker pull portainer/portainer-ce
docker volume create portainer_data
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --restart=always portainer/portainer-ce

docker ps | grep portainer

# 접속은 서버 IP:9000으로 크롬으로 접속한다.
  • Portainer는 App Templates를 기본적으로 제공
  • 브라우저 콘솔 환경에서 이미지를 선택하고 명령어 없이 콘솔 환경에서 컨테이너 배포 가능

  • port가 임의의 port번호로 생성되어있다.

Docker-compose 설치

[root@ip-172-31-41-55 my-diary-3-proxy]# sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose

[root@ip-172-31-41-55 my-diary-3-proxy]# sudo chmod +x /usr/local/bin/docker-compose
profile
신입 개발자

0개의 댓글