<이미지 tag 및 push>
docker login # 터미널에 입력
docker tag 이미지명:태그명 이미지명:원하는 태그명
docker tag httpd:latest suhwan11/test:httpd-test
📗 push하기위해서는 tag생성시 계정명:태그명의 형식으로 작성해야한다docker push suhwan11/test:httpd-test
<이미지 제작>
컨테이너를 생성 후에 해당 컨테이너로 이미지를 생성.
docker commit명령어를 사용해서 생성 가능
다른 이미지를 가지고 이미지를 생성.
Dockerfile을 가지고 build를 구성해 생성 가능
docker commit [옵션] 컨테이너명 이미지명:태그
옵션 : --change (변경사항)
CMD : 컨테이너의 애플리케이션 지정
ENTRYPOINT : 컨테이너의 애플리케이션 지정(CMD에 비해서 우선)
LABEL : 이미지의 라벨 지정
VOLUME : 컨테이너의 볼륨 지정
USER : 컨테이너의 사용자 지정
WORKDIR : 컨테이너 작업 디렉토리 지정
ENV : 변수 지정
EXPOSE : 지정 포트 오픈
1 . docker commit 예시
# 기존의 이미지와 컨테이너 다 삭제한 상태에서 시작
docker run -d --name web1 httpd # 기존의 이미지로 컨테이너 생성
docker exec -it web1 bash
cd htdocs
cat > index.html # hello world 입력 후 exit
curl 172.17.0.2 # hello world 출력
docker commit web1 n_web1:v1 # 컨테이너로 새로운 이미지 생성
docker images # 새로운 이미지가 생성된 것을 확인
docker run -d --name n_web1 n_web1:v1 # 새로운 이미지로 컨테이너 생성
curl 172.17.0.3 # 위와 마찬가지로 hello world 출력
2 . change 옵션 사용
docker commit --change "VOLUME /usr/local/apache2/htdocs/" --change "WORKDIR /usr/local/apache2/htdocs/" web1 n_web:v2
# change 옵션으로 볼륨과 작업디렉터리 지정 후 컨테이너로 새로운 이미지 생성
docker inspect n_web:v2 | less
# 새로운 이미지 스펙확인해보면 볼륨과 디렉터리 생성되어있는 것을 확인
docker run -d --name n_web2 n_web2:v2
# 새로운 이미지로 컨테이너 생성
curl 172.17.0.4 # 1번과 마찬가지로 helloworld 출력
3 . 제작한 이미지로 간단한 web서버 생성 및 tag, push
# 모든 컨테이너 삭제한 상태에서 시작
docker run -itd --name os1 centos:7 # 컨테이너 생성
docker exec os1 yum -y install httpd # 웹 서버 패키지 설치
echo docker commit test > index.html
docker cp index.html os1:/var/www/html/
# index.html 구성
docker commit -c 'CMD ["httpd","-D","FOREGROUND"]' -c "VOLUME /var/www/html/" -c "WORKDIR /var/www/html/" -c "EXPOSE 80/tcp" -c "EXPOSE 443/tcp" -c "EXPOSE 443/udp" os1 new_web:v1
# 새로운 이미지 생성
# CMD를 입력할때에는 반드시 '' 따옴표를 사용해야 한다
# CMD를 제외하고는 다 " " 따옴표를 사용해야 한다
docker inspect new_web:v1 | less
# 변경사항들 확인
-> layer를 확인해보면 centos:7의 layer가 있는 것을 확인
즉, 기존의 centos:7 이미지의 layer가 있는 상태에서 해당 이미지로 컨테이너를 만들고, 컨테이너로 변경사항을 적용한 새로운 이미지를 만들었을때 기존의 layer에 새로운 layer를 추가한 것이다.
shell 방식 : yum -y install httpd
-> shell에서 명령어를 실행하듯이
exec 방식 : ['yum', '-y', 'install', 'httpd']
-> shell이 아니라 시스템에서 해당 명령어를 바로 실행
-> 개발자들이 더 선호하는 방식
docker run -itd --name os2 new_web:v1 # 새로운 이미지로 컨테이너 생성
curl 172.17.0.2 # docker commit test문구 출력
docker tag new_web:v1 suhwan11/test:makeimage
# push하기 위해 계정명이 포함되는 태그 생성
docker push suhwan11/test:makeimage
# docker hub repository에 push
-> tag, push를 통해 새로만든 이미지를 레포지토리에 저장할 수 있다
1 . Dockerfile로 web서버 생성
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
# Dockerfile 작성
index.html파일 생성 및 테스트 문구 입력
docker build -t my_web:v1 ./
# Dockerfile을 빌드해서 이미지를 생성
# './'는 자동으로 Dockerfile을 지정
docker inspect my_web:v1 | less # 변경사항이 적용되었는지 확인
docker run -d --name web1 -p 8080:80 my_web:v1 # 새로만든 이미지로 컨테이너 생성
curl 호스트ip:8080 # index.html의 텍스트가 보이는 것을 확인
2 . go 언어를 이용한 Dockerfile만들기
vi hello.go
📗 golang 접속 후 Try GO에 있는 text복사 후 붙여넣기
yum -y install wget
wget https://go.dev/dl/go1.20.linux-amd64.tar.gz # 복사한 링크
📗 다운로드 사이트에 가서 linux운영체제 다운로드 링크 복사
ls # 압축파일 다운받아졌는지 확인
tar xf go1.20.linux-amd64.tar.gz # 압축해제
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version
📗 go 설치가이드 보고 한줄씩 입력
go build hello.go # hello 실행파일 생성
./hello # hello파일 실행
-> hello 실행파일의 실행결과
mkdir go_pro # 디렉터리 생성
mv hello go_pro/
cd go_pro
vi Dockerfile # Dockerfile 작성
FROM scratch
COPY hello /
CMD ["./hello"]
docker build -t go_hello:v1 ./ # Dockerfile 빌드해서 이미지 생성
-> 해당 이미지로 컨테이너를 생성했더니 위의 결과와 동일한것을 확인
vi Dockerfile # Dockerfile 작성
FROM centos:7
RUN mkdir /start/
COPY hello /start/
CMD ["./hello"]
WORKDIR /start/
docker build -t hello:v2 ./ # Dockerfile 빌드해서 이미지 생성
-> 해당 이미지로 컨테이너를 생성했더니 위의 결과와 동일한것을 확인
2 -1 . go언어를 이용한 docker commmit으로 image생성
docker run -itd --name os2 centos:7
docker exec os2 mkdir /go_dir
# 생성한 컨테이너에 go언어 작업할 디렉터리 생성
docker cp hello os2:/go_dir
# hello실행파일을 생성한 작업 디렉터리에 복사
docker commit -c 'CMD ["/go_dir/hello"]' os2 go_app:v1
# hello실행파일 실행하는 이미지를 생성
docker run --name go_app go_app:v1
# 컨테이너를 실행하는 순간 hello실행파일의 코드를 실행시킨다
-> 위 사진은 hello실행파일의 코드를 실행시킨 결과
3 . Python을 이용한 image생성
docker run -itd --name os1 centos:7
docker exec -it os1 bash
mkdir /python_dir/ # python작업을 할 디렉터리 생성
cd /python_dir/
vi test.py # python실행 파일 생성 및 파이썬 코드 작성
print("hello world")
python test.py
# python실행 파일 실행
# 이전에 입력한 hello world출력
docker commit -c 'CMD ["./test.py"]' -c 'ENTRYPOINT ["python"]' -c 'WORKDIR /python_dir' os1 python_app:v1
# python실행파일을 실행시킬 이미지 생성
docker inspect python_app:v1 | less
# 생성한 image의 변경사항이 적용되었는지 확인
docker run --name pyhon_app1 python_app:v1
# 생성한 이미지로 컨테이너 실행
-> 컨테이너를 생성하는 순간 실행파일이 실행되면서 입력했던 python 코드가 출력되는 것을 확인
4 . push한 이미지 다시 다운받아서 컨테이너 생성
docker image pull suhwan11/test1:dockerfiletest
# docekr hub에 있는 나의 레포지토리에서 원하는 이미지를 다운받는다
docker images
# 이미지가 다운받아졌는지 확인
docker run -d --name web1 suhwan11/test1:dockerfiletest
# 다운로드 받은 이미지(이전에 내가 생성한 이미지)로 컨테이너 생성
-> 다운로드 받은 이미지에는 웹 서버설치와 index.html이 수정되었었고, CMD,VOLUME등의 변경사항을 추가해주었었다.
그러한 이미지를 레포지토리에 저장해놨다가 다시 다운로드 받아서 해당 이미지로 컨테이너를 만들면 내가 추가한 변경사항들이 적용된 컨테이너가 생성된 것을 알 수 있다.
FROM centos:7
RUN ["yum","-y","install","python3"]
RUN mkdir /root/python_work
COPY python.py /root/python_work/
CMD ["python.py"]
WORKDIR /root/python_work/
ENTRYPOINT ["python3"]
print("input name")
name = input("")
age = input("")
print(name,age)
for i in range(5):
print(age)
docker run -it --name web11 image:v4