host network: 기본적으로 호스트의 네트워크를 사용하는 것, 해당 사용 여부는
IP주소와 함께 port도 같이 고려해야함
80 port/tcp 이용하는 http 서비스에 host 네트워크를 web1 컨테이너에서 사용
-> 같은 port번호를 이용하는 컨테이너들은 host 네트워크를 사용하지 못함.
-> db와 같은 다른 port번호를 이용하는 컨테이너는 host 네트워크에서 사용이 가능하다.
도커
하나의 호스트에서 하나의 컨테이너만을 컨트롤 할수 있다
docker-compose
하나의 호스트에서 다수의 컨테이너를 관리해주는 플렛폼
오케스트레이션(쿠버네티스 등)
다수의 호스트에서 다수의 컨테이너를 관리해주는 플렛폼
도커허브 회원가입을 진행한 이후 레포지토리를 새로 만들어준다.
계정명: shinhyeonsik
저장소명: test
# 도커 허브 가입 후 로그인
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
컨테이너를 생성 후에 해당 컨테이너로 이미지를 생성
-> docker commit 명령어를 사용해서 생성 가능
다른 이미지를 가지고 이미지를 생성
-> Dockerfile을 가지고 생성 가능
컨테이너를 이미지로 만들기 위한 명령어
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
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
# 만들었던 이미지, 컨테이너 삭제
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은 코드 형태의 텍스트 문자이며 여러가지 지시어를 사용하여 이미지를 제작할 수 있다. 이것의 장점으로는 컨테이너가 실행하는 CMD 또는 ENTRYPOINT는 commit이나 import로는 지정하기 어렵지만 이 파일로는 지정이 가능하다는 점이다.
CMD 항목 정의 방식
shell 방식 -> yum install -y httpd : shell에서 명령어를 실행하듯이, /bin/sh와 같은 쉘을 통해 명령을 실행
exec 방식 -> ['yum','install','-y','httpd'] :shell이 아니라 시스템에서 해당 명령어 자체를 바로 실행하듯이, 명령을 쉘에서 실행하지 않음
# 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
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