ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5월 24일
    카테고리 없음 2023. 5. 24. 19:45

    ▼더보기 클릭

    더보기

     

    왼쪽과 같이 레이어 하나가 더 있다는 것은 오버헤드가 발생한다는 의미이기도함. 

    컨테이너 자체를 commit명령을 통해 이미지로 만드는과정은 원래 있었던 소스파일을 이미지로 구워낼 수 있었기때문에 보여지는 것과 다르게 결과가 다르게 나옴.

    -v라는 옵션이 외부에 저장공간을 두고 백업같은 역할을 한다. 
    컨테이너가 지워지더라도 같이 지워지지 않음. 



    -v 옵션은 aws 의 ebs 사용했던 것과 같은 개념이라고 보면됨.

     


    성능이 컨테이너 기술이 더 빠르게 운영될 수 있음. 

    vm들을 구성하려면 반드시 필요한 운영체제가 있는데 오버헤드가 된다. 

    그래서 가상화 기술이 컨테이너 기술보다 조금 더 떨어진다.

     

     

    도커 이미지 : 우리가 만든 ami와 도커 이미지와 비슷함. 

    도커 컨테이너 : 실행하자마자 프로세서에 올라감. 

     

    도커 컨테이너 라이프사이클

     

     
     

     
    도커 이미지가 컨테이너로 만들어지고, start나 run 명령을 통해 프로세스에 올라감. 
     
    #docker ps
    proccess에 올라가 있는 도커 컨테이너가 없냐고 물어보는 것. 
     
    # docker container cp /tmp/index.html test_commit_web:/usr/share/nginx/html # docker container cp /tmp/images test_commit_web:/usr/share/nginx/html

    더보기

     

    도커 호스트의 아이피로 접근을 해보면 문제가 발생함. welcome to enginx가 나옴

    # docker container cp /tmp/index.html test_commit_web:/usr/share/nginx/html

    해당 명령은 Docker 컨테이너와 호스트 시스템 간에 파일을 복사하는 명령입니다.
    여기서 사용된 옵션과 인자들의 의미는 다음과 같습니다:

    - `container cp`: Docker 컨테이너와 호스트 시스템 간에 파일을 복사하기 위한 명령입니다.
    - `/tmp/index.html`: 호스트 시스템의 `/tmp` 경로에 있는 `index.html` 파일입니다. 복사할 파일의 경로를 지정합니다.
    - `test_commit_web`: 복사 대상이 되는 Docker 컨테이너의 이름이나 ID입니다. 이 경우 `test_commit_web`이라는 이름의 컨테이너입니다.
    - `:/usr/share/nginx/html`: 복사한 파일을 붙여넣을 컨테이너 내부의 경로입니다. `:`로 구분된 왼쪽은 컨테이너 내부의 경로이고, 오른쪽은 호스트 시스템의 경로입니다. 이 경우 `index.html` 파일을 `test_commit_web` 컨테이너의 `/usr/share/nginx/html` 경로에 복사합니다.

    따라서 위 명령은 호스트 시스템의 `/tmp/index.html` 파일을 `test_commit_web` 컨테이너의 `/usr/share/nginx/html` 경로로 복사하는 작업을 수행합니다. 이를 통해 호스트 시스템의 파일을 컨테이너 내부로 전달할 수 있습니다.

     

     

    # docker container cp /tmp/images test_commit_web:/usr/share/nginx/html

    특정 경로에 있는 index 파일과 이미지 파일을 cp명령으로 통째로 옮겨줬더니 새로 접속이 됨. 


     
    이미지 날리고 새로 만들기!!!

    # docker image ls  (= docker images)
    # docker image rm -f test_commit
     
    다시 확인해보니까 이미지가 남아있음. 왜 안지워지지?
     

    -f 명령으로 다시 지워보기
    #docker image rm -f a1503e8b3191

    #docker ps 
    실행중인 컨테이너를 확인할 수 있음. 

     
     
    commit 명령을 통해서 컨테이너를 이미지로 만들고 삭제하기
    #docker commit -a "ssoontory<test@example.com>" -m "Congratulations V1.0" test_commit_web test_commit:v1.0
    $ docker commit [컨테이너명] [원하는 이미지명:태그]

    더보기

    해당 명령은 Docker 컨테이너를 기반으로 새로운 이미지를 생성하는 명령입니다.

    여기서 사용된 옵션과 인자들의 의미는 다음과 같습니다:

    - `commit`: Docker 컨테이너를 기반으로 새로운 이미지를 생성하기 위한 명령입니다.
    - `-a "ssoontory<test@example.com>"`: 새로운 이미지의 작성자(author) 정보를 지정하는 옵션입니다. 이 경우 `ssoontory<test@example.com>`으로 작성자를 지정하였습니다.
    - `-m "Congratulations V1.0"`: 새로운 이미지에 대한 설명(message)을 지정하는 옵션입니다. 이 경우 "Congratulations V1.0"으로 이미지에 대한 설명을 지정하였습니다.
    - `test_commit_web`: 이미지를 생성할 Docker 컨테이너의 이름이나 ID입니다. 이 경우 `test_commit_web`이라는 이름의 컨테이너입니다.
    - `test_commit:v1.0`: 생성될 이미지의 이름과 태그를 지정하는 부분입니다. `test_commit`은 이미지의 이름이며, `v1.0`은 이미지의 태그입니다.

    따라서 위 명령은 `test_commit_web` 컨테이너를 기반으로 새로운 이미지를 생성합니다. 새로운 이미지의 작성자는 `ssoontory<test@example.com>`이며, 설명은 "Congratulations V1.0"으로 지정되었습니다. 생성된 이미지의 이름은 `test_commit`이며, 태그는 `v1.0`입니다.

     

     

    https://tttsss77.tistory.com/230

     

    도커(Docker) : 이미지 커밋(업데이트)하기

    개요 일반적으로 도커 컨테이너 상에서 작업한 내용(예: 인터넷으로부터 파일을 다운로드하거나 파일의 내용을 변경하는 등)들은 컨테이너가 종료되면 함께 사라집니다. 도커 컨테이너 상에서

    tttsss77.tistory.com

     

     
    #docker images

     
    도커 호스트의 디시크 공간을 적게 차지하기 위해 그 전에 있었던 이미지를 변경사항 부분만 고쳐서 새로운 아이디로 만들어서 그대로 둠. 이미지는 anginx에서부터 차지하는 아이디가 그 언저리에 있다가 그 기반 위에다가 test_commit이라는 것을 다시 만들어서 얹음
     
     
    # docker rm -f test_commit_web
    컨테이너 삭제


    # docker rmi -f centos:latest
    이미지 삭제 

     
     

     
     


    기본 nginx 이미지로 컨테이너 생성
    index.html 이미지 파일 복사 
    이미지 커밋으로 이미지 생성
    커밋으로 생성한 이미지를 가지고 컨테이너 실행 


    # docker inspect test_commit:v1.0

     
    여러가지 변동사항 발생할 때마다 한칸씩 레이어로 존재해서 늘어나감. (기존 것들을 지우지 않고 그걸 기반으로)

     


    CentOS에서 작업했던 것을 다른 컨테이너로 보내는 작업 

    # docker images

    여기 있는 이미지를 따로 패키징을 이용해서 모아주기.
    이번 실습에서는 tar파일로 test_commit 이라는 이미지를 파일로 생성해서 다른 컨테이너에 보내줄 것임.
    그 명령어는 save명령어임
     
    # docker save -o test_commit.tar test_commit:v1.0
     

    더보기

    해당 명령은 Docker 이미지를 파일로 저장하는 명령입니다.

    여기서 사용된 옵션과 인자들의 의미는 다음과 같습니다:

    - `save`: Docker 이미지를 파일로 저장하기 위한 명령입니다.
    - `-o test_commit.tar`: 저장할 파일의 경로와 이름을 지정하는 옵션입니다. 이 경우 `test_commit.tar`라는 파일로 이미지를 저장합니다.
    - `test_commit:v1.0`: 저장할 이미지의 이름과 태그를 지정하는 부분입니다. 이 경우 `test_commit`이라는 이름의 이미지의 태그가 `v1.0`인 이미지를 저장합니다.

    따라서 위 명령은 `test_commit:v1.0` 이미지를 `test_commit.tar`라는 파일로 저장하는 작업을 수행합니다. 이렇게 저장된 파일은 나중에 다른 Docker 호스트에서 이미지를 로드(load)하여 사용할 수 있습니다.

     

     

     

    tar파일은 압축파일이 아니라 아카이브 파일임. 그래서 그 파일의 크기를 보면, 14717440 바이트, 147메가 정도 됨.

    압축 기능이 없기때문에 사이즈가 작아지지는 않음.

    압축을 위해서는 tar.gzip과 같은 압축 도구를 이용해주어야함. 

     

     

    확인



     

    이제 타르파일로 이미지로 변경해주기.

    # docker load -i test_commit.tar

     

    해당 명령은 Docker 이미지를 파일에서 로드하여 Docker 호스트에 이미지를 등록하는 명령입니다.
    여기서 사용된 옵션과 인자들의 의미는 다음과 같습니다:
    - `load`: Docker 이미지를 파일에서 로드하기 위한 명령입니다.
    - `-i test_commit.tar`: 로드할 이미지 파일의 경로와 이름을 지정하는 옵션입니다.
    이 경우 `test_commit.tar`라는 파일에서 이미지를 로드합니다. 따라서 위 명령은 `test_commit.tar` 파일에서 이미지를 로드하여 Docker 호스트에 등록하는 작업을 수행합니다. 이렇게 등록된 이미지는 Docker 호스트에서 사용할 수 있게 됩니다.

     

    여기까지

     
     

     
    --- 우분투 도커 설치

    $ sudo apt update
    $ sudo apt install apt-transport-https ca-certificates curl software-properties-common
    $ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
    우분투는 숫자가 아닌 다른 이름으로 버전 관리를 함. bionic = 18.04 
    $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable"  #xenial = 16.04
    $ sudo apt update
    $ sudo apt-cache policy docker-ce
    $ sudo apt install docker-ce -y
     
    ▼ 명령어 설명

    더보기

    위의 명령어들은 Ubuntu 시스템에서 Docker를 설치하기 위한 일련의 명령어다.

    1. `sudo apt update`: 시스템의 패키지 목록을 업데이트하는 명령어입니다. 최신의 패키지 정보를 가져옵니다.
    2. 'sudo apt install apt-transport-https ca-certificates curl software-properties-common'은 Ubuntu 시스템에서 HTTPS를 통해 APT(Advanced Package Tool) 패키지를 다운로드하고 설치하기 위해 필요한 패키지들을 설치하는 명령어입니다.

    설명을 간략하게 정리하면 다음과 같습니다:

    - `apt-transport-https`: APT를 사용하여 HTTPS 프로토콜을 통해 패키지를 다운로드할 수 있도록 해주는 패키지입니다. HTTPS는 데이터의 보안성을 강화하기 위해 사용됩니다.
    - `ca-certificates`: 시스템에 신뢰할 수 있는 인증서(authority certificates)를 제공하는 패키지입니다. HTTPS 연결에서 인증서의 유효성을 확인할 수 있도록 도와줍니다.
    - `curl`: 명령줄에서 URL을 통해 데이터를 전송하거나 받을 수 있는 도구입니다. HTTPS를 통해 Docker와 같은 패키지를 다운로드할 때 사용됩니다.
    - `software-properties-common`: 소프트웨어 관리를 위한 공통 도구 모음 패키지입니다. 새로운 저장소를 추가하거나 패키지 관리에 필요한 도구들을 포함합니다.

    위의 명령어를 실행하면 이러한 패키지들이 시스템에 설치되어 APT를 통해 HTTPS로 안전하게 패키지를 다운로드하고 설치할 수 있게 됩니다.
    3. `sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -`: Docker의 공식 GPG(GnuPG) 키를 다운로드하고 시스템에 추가하는 명령어입니다. 이는 Docker의 패키지가 신뢰할 수 있는 소스에서 제공되고 서명된 것임을 확인하기 위한 것입니다.
    4. `sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"`: Docker의 APT 저장소를 시스템에 추가하는 명령어입니다. 이 저장소에서 Docker 패키지를 다운로드할 수 있게 됩니다.
    5. `sudo apt update`: Docker 저장소를 포함하여 시스템의 패키지 목록을 다시 업데이트하는 명령어입니다.

    우분투의 보안, 기능 업데이트를 하게 됨. 
    6. `sudo apt-cache policy docker-ce`: 시스템에 설치 가능한 Docker CE(Community Edition) 패키지의 상세 정보를 확인하는 명령어입니다.

    docker-ce라고하는 커뮤니티 에디션에 따른 버전을 보여줌.
    실행하면 Docker CE 패키지에 대한 다양한 정보가 출력된다. 

    - Candidate: 설치 가능한 패키지 버전 정보입니다. 최신 버전이라면 해당 버전이 표시된다.
    - Version Table: 설치 가능한 패키지의 버전 목록과 해당 버전의 저장소 정보가 나열된다.
    - Installed: 현재 시스템에 설치된 Docker CE 패키지 버전 정보다. 설치되지 않은 경우 `(none)`으로 표시된다.

    `apt-cache policy` 명령어를 사용하여 Docker CE 패키지의 상세 정보를 확인할 수 있으며, 이를 통해 설치 가능한 버전과 설치된 버전을 확인할 수 있다.
    7. `sudo apt install docker-ce -y`: Docker를 설치하는 명령어입니다. `-y` 옵션은 설치 도중 물음에 대해 자동으로 "yes"로 응답하여 사용자의 확인을 요구하지 않도록 합니다.

    위의 명령어들을 실행하면 Ubuntu 시스템에 Docker가 설치됩니다. 이후에는 Docker를 사용하여 컨테이너를 실행하고 관리할 수 있습니다.

     

     

     

     

     
    우분투에서 도커를 설치하고 센토스랑 이미지 전송받는 실습 시작

    더보기

    우분투에서 도커를 설치하고 센토스랑 이미지 전송받는 실습 시작

    부팅 먼저 하고 MAC주소 바꿔주기.

    스냅샷도 찍어주기

     

     

    그냥 고

     

     

     

    $ sudo apt update


    $ sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
    $ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

    우분투는 숫자가 아닌 다른 이름으로 버전 관리를 함. bionic = 18.04 

    $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable"  #xenial = 16.04
    $ sudo apt update


    $ sudo apt-cache policy docker-ce

    community edition (무료)
    $ sudo apt install docker-ce -y

     

    앞에 sudo 를 붙이지 않으면 퍼미션 에러가 남. 

     $sudo docker version

    도커라는 그룹의 사용자 명을 

     

     

    $ sudo usermod -a -G docker ssoontory 

     
     

    ubuntu에 잘 들어와있는 것을 확인해 볼 수 있다. 
     

    tar 파일 로드하기
    $ docker load -i test_commit.tar

     
     

     
     

    더보기

    centOS의 도커라는 이름의 호스트가 있다. 

    도커 호스트에 현재 활성화된 컨테이너는 하나밖에 없음. 

    veth 는 virtual ether net이라는 가상의 랜선이라는 뜻인데, 가상환경인 도커라고 하는 운영체제가 이미 존재. 이 안쪽에 있는 애들을 바깥쪽에 연결시켜주는 게이트웨이 역할이자 스위치의 역할을 함. 

    enp0s3가 빨간색 랜카드인 eth0과 같음. 이것이 docker0와 연결. 이건 현재 veth1를 가지고 컨테이너와 연결되어 있다. 

    13: vethe90dbca@if12: 는 도커 호스트의 연결 링크의 이름임. 

    도커 안쪽에는 어떠한 네트워크 정보가 있는지 확인해보기

     

    # docker ps 

     

    /bin/bash안적어도 들어갈 수 있음 . 주링ㄹ 수 있음. 

     

    이미지를 작게 만들다보니 ip a라는 명령어가 없다. 

    우리는 네트워크 구조를 보기위해 아이피를 확인해야함... 

     

    아이피를 볼 수 있는 명령어를 설치해주기!

    이미지 한켠에는 nginx가, 또 한켠에는 다른 이미지가 있을것임. 사실을 os가 아니지만 os를 흉내낸 베이스 이미지가 있을 것임. 쉽게 아는 방법 yum 쳐보고 먹히면 centod, apt명령을 쳐보면 에러가 안뜸 ubunt또는 devian 임. 

     

    # cat /etc/os-release

    데비안임을 알 수 있다. 

     

    그럼 이제 ubuntu아이피 명령어 설치를 검색해보기

     

    $

     

     

    13: vethe90dbca@if12: 12:&amp;nbsp;eth0@if13:

     
     
    네트워크 이용해보기
    - 도커도 my-vpc와 같이 vpc를 만들고 ip대역도 내가 원하는 대역으로 설정해 볼 수 있게 만들기
     
     
    현재 기본적으로 세팅되어있는 network환경

     
    브릿지라고 되어있는 docker0는 라우트 역할을 함. 

    +40 씩 해주기

    10.63.0.0/16으로 꾸미기!!! 
    이걸 통째로 이용하겠다고 선언해주기! 
    ip를 16비트 보다는 숫자가 이상인 숫자를 적어서 내가 사용할 네트워크 수를 줄여주기!
     
    # docker network create -d bridge --subnet 10.63.0.0/16 --ip-range 10.63.0.0/24 test_bridge
    -d : driver
    # docker network ls
    # docker inspect test_bridge

    더보기

    #docker network create -d bridge --subnet 10.63.0.0/16 --ip-range 10.63.0.0/24 test_bridge

     

    # docker network ls

     

    # docker inspect test_bridge

     

    이미 만들어둔 컨테이너에 연결된 docker0라는 이름의 브릿지에서 떼서 test_bridge에 연결해보기.

    container 이름으로도 알 수 있음. 그 이름은 webserver

    # docker network connect test_bridge webserver
    # docker inspect webserver

     

    # docker network disconnect bridge webserver

    도커는 연결도 할 수 있지만 

     

     

    내가 만든 test_bridge를 넣어줄 수 있음. 

     

    # docker container run -d -p 80800:80 --name webserver1 --network test_bridge test_commit:v1.0

    컨테이너를 실행시켜야되기 때문에 이미지가 필요함.  

    기본 nginx 냅두고 내가 정해둔 이미지인 test_commit:v1.0을 이용. 

     

    그 전에 먼저 지워주기

    # docker ps -a 

    # docker container prune (현재 사용하지 않는 컨테이너를 지우고자 할때 사용! 컨테이너 정리하기!!)

    `docker container prune 명령어는 사용하지 않는 도커 컨테이너를 제거하는 명령어. 실행하면 다음과 같은 작업이 수행됨:

    1. 실행 중이지 않은 모든 도커 컨테이너를 확인합니다.
    2. 중지된 컨테이너들과 관련된 모든 리소스를 제거합니다. 이에는 컨테이너의 파일 시스템, 네트워크 설정, 볼륨, 로그 파일 등이 포함됩니다.
    3. 제거된 컨테이너들은 복구할 수 없습니다. 따라서 신중하게 사용해야 합니다.

    `docker container prune` 명령어를 사용하여 사용하지 않는 컨테이너들을 정리하면, 도커 환경에서 자원을 절약하고 관리하기 쉬워집니다. 또한, 사용되지 않는 컨테이너들이 리소스를 차지하지 않게 하여 시스템 성능을 향상시킬 수 있습니다.


     

    다 지워주고 

    docker run -d -p 8080:80 --name webserver1 --network test_bridge test_commit:v1.0

     

    # docker inspect webserver1

     

     

    # docker network inspect test_bridge 아이피를 쉽게 할 수 있다. 

     


     도커 이미지 build에 앞서 워드 프레스 설치해보기
     
    --- 워드프레스
    - dbserver
    # docker run -d -p 3306:3306 --name dbserver \
    -e MYSQL_DATABASE=wordpress \
    -e MYSQL_USER=wpuser \
    -e MYSQL_PASSWORD=wppass \
    -e MYSQL_ROOT_PASSWORD=password --network test_bridge mariadb
     
    - webserver
    # docker run -itd -p 8888:80 --name apache --network test_bridge centos:7
    # docker exec -it apache bash
    yum install -y httpd php php-mysql php-gd php-mbstring wget unzip
    wget https://ko.wordpress.org/wordpress-4.8.2-ko_KR.zip
    cd /var/www/html
    unzip /wordpress-4.8.2-ko_KR.zip
    mv wordpress/* ./
    chown -R apache:apache /var/www
    httpd & #systemctl enable --now 와 같은 의미. & 기호는 forground 실행. httpd가 구동이 도ㅣㅁ

    더보기

    --- 워드프레스
    - dbserver
    # docker run -d -p 3306:3306 --name dbserver \
    -e MYSQL_DATABASE=wordpress \
    -e MYSQL_USER=wpuser \
    -e MYSQL_PASSWORD=wppass \
    -e MYSQL_ROOT_PASSWORD=password --network test_bridge mariadb

     

     

    -d 밖에서 작업하지 말라는 의미로 적어주기 

    -e 는 환경변수를 세팅해줌. 일종의 변수의 지정과 같음. 

    변수의 이름은 정해진대로 사용.  

     

    https://hub.docker.com/_/mariadb

     

    mariadb - Official Image | Docker Hub

    Note: the description for this image is longer than the Hub length limit of 25000, so has been trimmed. The full description can be found at https://github.com/docker-library/docs/tree/master/mariadb/README.md. See also docker/hub-feedback#238 and docker/r

    hub.docker.com

     

    아래 보면 미리 환경변수가 정해져있음을 확인해볼 수 있다. 

     

     

     #docker ps

    워드프레스 포트 3306포트가 열려있는 것을 확인해볼 수 있다. 

     

     

    워드프레스를 위한 웹서버를 만들기

    - webserver
    # docker run -d -p 8888:80 --name apache --network test_bridge centos:7

    nginx 띄울 때 했던 위의 방법으로 해보면 왜 -itd로 설치를 해야하는지 알게 됨. 

    이름은 centos 이지만 아주 미니 버전임. centos 자체가 웹서버의 역할을 하지는 않음. 

    centos 자체는 아파치 웹서버는 아니지만 컨테이너 하나를 만들고 나서 나중에 뒤에서 필요한 util들을 넣어줄 것임.

    오류가 나진않았지만 제대로 process가 올라가지 않음. 

    # docker ps

    없음!!

    # docker ps -a

    포트 정보를 가지고 있지 않는데 포트번호를 넣어주어서 실행되지않음. 

    CentOS는 기본적으로 포트 정보를 가지고 있지 않음! 

     

    # docker rm -f apache 지우고 포트 정보를 지우고 다시 실행

     

     

    CentOS는 vm 처럼 띄우기에는 너무 제한적임. 

    그래서 -itd를 해야 그나마 유지가 됨.

     

    # docker run -itd -p 8888:80 --name apache --network test_bridge centos:7

    조금은 vm스러운 방법으로 워드프레스 웹서버를 만들어볼 예정.

    먼저 CentOS를 활용한 컨테이너 하나를 만들기

    이름음 apache 옵션은 -itd -d

    # docker ps

    접속하면 아무것도 안나옴. 


    # docker exec -it apache bash

    centOS라는 apache에 들어가기!


    yum install -y httpd php php-mysql php-gd php-mbstring wget unzip
    wget https://ko.wordpress.org/wordpress-4.8.2-ko_KR.zip
    cd /var/www/html
    unzip /wordpress-4.8.2-ko_KR.zip

    mv wordpress/* ./
    chown -R apache:apache /var/www
    httpd &

     

     

    # ping google.com

    핑 명령어도 있고,  잘 나감. 

    DNS 기능도 있어서 앞서 만든 dbserver로 핑을 치면 핑이 나가기도함. 

    아이피로도 당연히 나감. 

    같은 네트워크로 지정해줬기 때문에 가능한 것

     

    # cd /var/www/html

    위에서 httpd를 설치했기 때문에 이 경로가 있음.

     

    unzip /wordpress-4.8.2-ko_KR.zip

    mv wordpress/* ./
    chown -R apache:apache /var/www
    httpd & #systemctl enable --now 와 같은 의미. & 기호는 forground 실행. httpd가 구동이 도ㅣㅁ

     
    도커 이미지 생성
     

    앞서 워드프레스를 이용하기 위한 구성정보들을 하나의 파일로 만들어놓은 것이 Dockerfile이 되는 것임. 
    앞에 D는 대문자로!!!!!!
     
    Docker file이 뚝딱 만들어지는 것이 아니라 중간중간 실행에 필요한 것들은 실제로 임시적인 컨테이너를 중간에 만들어서 명령어들을 실행하고, 그 결과물들을 도출해서 도커 이미지로 넣어서 도커 이미지를 저장하는 것임. 
    그래서 중간중간 임시 컨테이너들이 만들어지고 없어지고를 반복하는 것을 확인할 수 있음. 
    컨테이너가 실행이 되고 멈추고를 거쳐서 과정이 진행이 되는 것을 확인해볼 수 있다. 
     
    모든 내용들이 오로지 대문자로 표기가 되어야 한다. 
    FROM은 BASE 이미지를 지정하는 작업임.

     

    더보기

    --- 도커 파일 이해
    # vi Dockerfile
    FROM ubuntu:18.04

    모든 내용들이 오로지 대문자로 표기가 되어야 한다. 

    FROM은 BASE 이미지를 지정하는 작업임. FROM에는 enginx, SUSE등이 있음. 

    *단 베이스를 ubuntu로 깔았을 경우 해당 이미지에 맞는 명령어를 지정해줘야함.


    MAINTAINER ssoontory (Author과 같은 의미. 도커 파일은 이런 형식으로 만들어줌.)
    LABEL "name"="webserver"

    도커 파일의 정보임. 이미지의 라벨을 붙임. 이미지가 어떠한 용도로 쓰일지 정보를 전달하기 위해서 씀.
    ENV aloha=date

    환경 변수, 알로하라고 찍으면 date가 나오게끔 집어넣음.
    ENV path=/var/www/html

    path라고 하는 변수 명은 인덱스파일이 위치한 경로를 집어넣으라고 지정.
    RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list

    (치환명령어 archive.ubuntu.com은 미국 동부에 있는 저장소. 도커에서는 미 동부 사이트로 들어가서 설치 작업을 함. 근데 그 부분이 너무 거리가 먼곳에 접속을 하는거라 거기로 가지말고 대한민국 어딘가에 있는 kakao같은 주소로 바꾸라는 소리임.)
    RUN apt-get update
    RUN apt-get install apache2 -y
    COPY nihao /var/www/html/nihao

    COPY 명령을 통해서 nihao라고하는 폴더를 도커 호스트에 미리 만들어둠.

    그 폴더 통째로 카피를해서 해당 경로에 집어넣는 명령임.
    COPY hello.html $path

    위에서 정의한 path변수의 정보를 가져오겠다.

    hello.html이 copy명령을 통해서 $path 경로로 넘어가게끔만들어줌.
    ADD aws.tar /var/www/html

    ADD는 카피보다 조금 더 나음. 아카이브가 되어있는 타르파일을 풀어서 풀어준 내용을 /var/www/html 경로로 집어넣어줌. Copy는 tar파일을 풀 수 있고, ADD는 tar 파일을 풀어줄 수 있음!!!!
    WORKDIR /var/www/html

    작업데이터인 WORKDIR을 지정하면 들어가자마자 경로가 최상의 폴더가 아니라 /var/www/html이 바로 나올 수 있게끔 설정하는 것이 WORKDIR이다.


    RUN echo ohayo >> ohayo.html

    echo명령을 통해 ohayo를 만들면 위에서 WORKIDR에서 지정한 경로에서 모든 작업을 하게 됨.

    따라서 ohayo 파일이 /var/www/html명시되어 있지 않아도 바로 저기로 들어가진다.


    VOLUME /var/www/html

    볼륨 마운트는 -v라고하는 옵션과는 약간의 차이가 있음.

    외부의 도커 호스트 특정 경로와 /var/www/html컨테이너 경로와 마운트 해줌. 약간의 차이는 있음. 

     

    # -v /tmp:/var/www/html 근데 위에 volume경로는 앞에있는 경로처럼 호스트의 경로가 없고  컨테이너의 경로만 있음. -v 와 다른점임. 도커 호스트의 특정한 경로를 지정할 수 없게 되어 있음.  
    EXPOSE 80

    포트 내보내기. docker run -d -P nginx nginx가 데몬으로쓰는데 포트번호를 랜덤으로 주고 싶을때 대문자 P를 씀.

    대문자 P로 포트가 랜덤하게 정해진 것은 아는데, 앞에 포트를 랜덤하게

    앞,외부 포트는 랜덤하게 32768을 주리고 했는데, 위에 있는 포트에 대해서는 내용이 없음. 

    컨테이너에 이미 등재가 되어있는 expose정보를 보고 포트를 줌. 

    만약 expose가 8080이면  내부 컨테이너포트가 8080으로 바뀜
    ENTRYPOINT ["apachectl"] # ["apachectl", "-D", "FOREGROUND"]
    CMD ["-D", "FOREGROUND"] # ["apachectl", "-D", "FOREGROUND"]

    둘다 데몬을 실행한다는 공통점을 가지고 있다. 

    엔트리 포인트는 한번 정해지면 그 옵션을 바꿀 수 없게 픽스 시킴. 따라서 유저가 어떻게든 고칠 수 없게 만들어둘때 사용.

    cmd는 인자같은 걸 줘서 여기에 들어가는 demon 실행의 일부를 바꿀 수 있다. 추후에 이 이미지를 가진 사용자가 입맛에 맞게 인자를 바꿀 수 있게 할때 이 커맨드를 이용

     


    # docker build -t halilinux/hello:v1.0 .

    사용자가 root
    누군가 root가 아닌 다른 일반 사용자로 로그인 할 수 있게 퍼미션 제어를 하고싶을때 하는 설정이 사용자의 설정임.

     
    별다른 이름 없이 .만 찍어도 같은 폴더 내에 있는 Dockerfile을 찾아서 순차적으로 지가 알아서 실행해서만들어줌.
    점만 찍을 수 있었던건 도커 파일을 만들때 도커 파일의 이름규칙때로 D를 대문자로시작해서 소문자로 끝냈기 때문.
     
    만약 vi testfile 이라고 정했다면,
    -f를 써서 testfile .이런식으로 써야됨 개귀찮
     
    그냥 하나의 도커파일만 만들어라. 귀찮으니까
    vi Dockerfile이라고 만들면 .만 찍어도 지가 알아서 찾아줌.
     

     
    hello라는 이미지가 잘 만들어진 것을 확인해볼 수 있다. 
    # docker images
     

    r

     
     

     
     
    # docker run -d -P hello:v1.0
    -P를 썼으니 Expose포트로 정한 80포트가 컨테이너 포트로 지정되고 호스트 포트와 이름은 랜덤으로 지정됨.

     
     

     
    바로 들어가면 경로가 html로 들어감. 
    워크 때문에 가능한 것임. 
     
     
    volume 에서 지정된 볼륨 리스트를 보면 나오는 name이 좀 길지만 docker volume inspect 를 통해 

    댓글

SSOONTORY Blog.