[Docker] 이미지 제작 및 업로드 & Dockerfile 설정

신현식·2023년 2월 9일
0

구름_Docker

목록 보기
5/6
post-thumbnail

리뷰

host network: 기본적으로 호스트의 네트워크를 사용하는 것, 해당 사용 여부는
IP주소와 함께 port도 같이 고려해야함

80 port/tcp 이용하는 http 서비스에 host 네트워크를 web1 컨테이너에서 사용
-> 같은 port번호를 이용하는 컨테이너들은 host 네트워크를 사용하지 못함.
-> db와 같은 다른 port번호를 이용하는 컨테이너는 host 네트워크에서 사용이 가능하다.

  • 도커
    하나의 호스트에서 하나의 컨테이너만을 컨트롤 할수 있다

  • docker-compose
    하나의 호스트에서 다수의 컨테이너를 관리해주는 플렛폼

  • 오케스트레이션(쿠버네티스 등)
    다수의 호스트에서 다수의 컨테이너를 관리해주는 플렛폼

이미지 제작 및 업로드

도커허브 회원가입을 진행한 이후 레포지토리를 새로 만들어준다.
계정명: shinhyeonsik
저장소명: test

  • docker tag
    이미지명과 태그를 수정하기 위한 명령어이다. 이미지의 이름을 변경하는 기능은 없으며, 태그 기능을 사용하여 이미지를 가리키는 이름을 하나 추가하는 형태이다. 이미지를 업로드 하려는 목적이라면 (저장소계정명/저장소명:태그) 형태를 유지하는 것이 좋다.
    docker tag 원본이미지 생성이미지
  • 태그로 생성된 것들을 보면 같은 이미지 id를 가진 것을 볼 수 있다.
  • docker login
    도커 레지스트리에 접속하기 위한 명령어이다. login 후에 특정 주소를 적지 않으면 자동으로 docker hub에 접속한다.
  • docker push
    이미지를 레지스트리에 등록하기 위한 명령어이다. 업로드된 이미지는 도커 허브에서 확인할 수 있다. 또한 이미지를 업로드 할 때 반드시 docker login 명령으로 로그인한 사용자의 아이디와 이미지 이름의 앞의 값이 같아야 한다.
    docker push 등록이미지
# 도커 허브 가입 후 로그인
docker login
Username: shinhyeonsik
Password:

# 태그 생성
docker tag centos:7 centos:shs
-> 생성이후 centos:7 이미지를 제거하게 되면 태그만 사라진다. 남아있는 태그까지 삭제해야지 레이어까지 모두 삭제됨


# push (저장소계정명/저장소명:태그), 이 형식으로 지정하지 않으면 push가 되지 않음
docker tag httpd:latest shinhyeonsik/test:httpd_test

docker push shinhyeonsik/test:httpd_test

image 생성방법

  1. 컨테이너를 생성 후에 해당 컨테이너로 이미지를 생성
    -> docker commit 명령어를 사용해서 생성 가능

  2. 다른 이미지를 가지고 이미지를 생성
    -> Dockerfile을 가지고 생성 가능

docker commit

컨테이너를 이미지로 만들기 위한 명령어
docker commit [옵션] 컨테이너명 이미지명:태그


docker run -d --name web1 httpd
docker ps

[root@docker ~]# docker exec -it web1 bash
root@1d29330f48d4:/usr/local/apache2# cd htdocs/
root@1d29330f48d4:/usr/local/apache2/htdocs# cat > index.html
hello-world
root@1d29330f48d4:/usr/local/apache2/htdocs# exit
exit

# web1 확인
curl 172.17.0.2

# 기존 컨테이너인 web1으로 새로운 이미지 생성 
docker commit web1 n_web:v1
docker images

# 만든 이미지로 실행
docker run -d --name n_web1 n_web:v1
docker ps

# 만들었던 이미지로 시작한 컨테이너로 같은 결과가 나오는지 확인
curl 172.17.0.3

docker commit --change 변경사항

  • CMD : 컨테이너의 애플리케이션 지정

  • ENTRYPOINT : 컨테이너의 애플리케이션 지정(CMD에 비해서 우선)

  • LABEL : 이미지의 라벨 지정

  • VOLUME : 컨테이너의 볼륨 지정

  • USER : 컨테이너의 사용자 지정

  • WORKDIR : 컨테이너 작업 디렉토리 지정

  • ENV : 변수 지정

  • EXPOSE : 지정 포트 오픈

# 이미지의 내용을 변경한 후 새로운 이미지 생성
docker commit --change "VOLUME /usr/local/apache2/htdocs/"
--change "WORKDIR /usr/local/apache2/htdocs/" web1 n_web1:v2

# 결과 확인
docker run -d --name n_web2 n_web1:v2
docker exec n_web2 pwd
docker exec n_web2 ls
docker exec n_web2 cat index.html

docker inspect n_web2 |grep -A 5 Mounts

new_web 만들기


# 만들었던 이미지, 컨테이너 삭제
docker rm -f $(docker ps -qa) 
docker image rm -f $(docker images)

# os1 컨테이너 생성 - centos:7 이미지 사용, os1 에 httpd 서비스구성
docker run -itd --name os1 centos:7
docker exec os1 yum install httpd -y

# index.html 파일 생성
echo docker commit test > index.html
docker cp index.html os1:/var/www/html/

# 확인
docker exec os1 ls /var/www/html

# CMD 수정 /  -c or --change
docker commit -c 'CMD ["httpd","-D","FOREGROUND"]' -c 'VOLUM
E /var/www/html/' -c 'WORKDIR /var/www/html' -c 'EXPOSE 80/tcp' -c 'EXPOSE 443/tcp' -c 'EXPOSE 443/udp' os1 new_web:v1

# new_web:v1 만들어진 것 확인
docker images
# 안에 내용이 수정이 되었는지 확인
docker inspect new_web:v1 | less
/Config 

# 컨테이너 실행
docker run -d --name n_web1 new_web:v1 

#웹페이지 확인 방법
docker run -d --name web3 -p 9090:80 new_web:v1
curl 192.168.56.102:9090
#웹페이지에서
192.168.56.102:9090

Dockerfile 만들기

도커는 Dockerfile을 사용하여 이미지를 제작할 수 있다. Dockerfile은 코드 형태의 텍스트 문자이며 여러가지 지시어를 사용하여 이미지를 제작할 수 있다. 이것의 장점으로는 컨테이너가 실행하는 CMD 또는 ENTRYPOINT는 commit이나 import로는 지정하기 어렵지만 이 파일로는 지정이 가능하다는 점이다.

  • Dockerfile 지시어

CMD 항목 정의 방식

  • shell 방식 -> yum install -y httpd : shell에서 명령어를 실행하듯이, /bin/sh와 같은 쉘을 통해 명령을 실행

  • exec 방식 -> ['yum','install','-y','httpd'] :shell이 아니라 시스템에서 해당 명령어 자체를 바로 실행하듯이, 명령을 쉘에서 실행하지 않음

Web server 설정 순서

  1. 컨테이너 생성
  2. index.html 파일 복사
  3. httpd 패키지 설치
  4. CMD, EXPORT, VOLUME, WORKDIR change 옵션으로 수정
# index.html 파일 생성
echo docker commit test > index.html
docker cp index.html os1:/var/www/html/

vi Dockerfile

FROM centos:7
RUN ["yum","-y","install","httpd"]
COPY index.html /var/www/html/index.html
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
VOLUME /var/www/html/
WORKDIR /var/www/html/
EXPOSE 80/tcp
EXPOSE 443/tcp
EXPOSE 443/udp

# 태그를 붙여서 도커파일을 실행해서 이미지 만듬
docker build -t myweb1:v1 ./
docker images

# 컨테이너 실행
docker run -d --name my_web1 myweb1:v1
docker ps
docker exec my_web1 pwd

go언어 사용


vi hello.go

// You can edit this code!
// Click here and start typing.
package main

import "fmt"

func main() {
	fmt.Println("Hello, 世界")
}


# go-lang 설치
yum install -y wget
# 리눅스 버전 설치파일을 링크 주소 복사 하면 됨.
wget https://go.dev/dl/go1.20.linux-amd64.tar.gz

# 압축해제
tar xf go1.20.linux-amd64.tar.gz

# 사이트 따라하기
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.linux-amd64.tar.gz

# 내용 추가
vi .bashrc

export PATH=$PATH:/usr/local/go/bin

bash
[root@docker ~]# go version
go version go1.20 linux/amd64


go build hello.go

nkdir go_pro
mv hello go_pro/
cd go_pro

vi Dockerfile
 
FROM scratch
COPY hello /
CMD ["./hello"]

docker build -t go_hello:v1 ./
docker images

# 실행
docker run --name hello go_hello:v1

golang 설치방법

profile
전공 소개

0개의 댓글