Ssoon
1주 : Jenkins CI/CD + Docker : 2 본문
CloudNet@ 가시다님이 진행하는 CI/CD 맛보기 스터디
✅ CI/CD 실습 환경 구성
- Jenkins와 Gogs를 실행하여 CI/CD 환경을 구축하는데 필요한 설정을 포함하고 있습니다. Jenkins는 CI/CD 파이프라인을 관리하고, Gogs는 Git 저장소를 호스팅하는 역할을 합니다.
- 이 설정 파일을 사용하여 두 서비스를 동시에 실행할 수 있습니다. docker-compose up -d 명령어로 Jenkins와 Gogs를 백그라운드에서 실행할 수 있습니다.
[ssoon@localhost cicd-labs]$ cat <<EOT > docker-compose.yaml
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins
restart: unless-stopped
networks:
- cicd-network
ports:
- "8080:8080"
- "50000:50000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- jenkins_home:/var/jenkins_home
gogs:
container_name: gogs
image: gogs/gogs
restart: unless-stopped
networks:
- cicd-network
ports:
- "10022:22"
- "3000:3000"
volumes:
- gogs-data:/data
volumes:
jenkins_home:
gogs-data:
networks:
cicd-network:
driver: bridge
EOT
- docker-compose.yaml 파일에 정의된 Jenkins와 Gogs 컨테이너가 실행되며, 각 서비스는 설정된 포트와 볼륨을 바탕으로 동작합니다.
- Jenkins는 웹 UI (8080 포트)와 Jenkins 에이전트 연결을 위한 포트 (50000)로 실행됩니다.
- Gogs는 Git 서비스를 제공하는 웹 UI (3000 포트)와 SSH 서비스 (10022 포트)로 실행됩니다.
[ssoon@localhost cicd-labs]$ docker compose up -d
[+] Running 21/21
✔ gogs Pulled 8.7s
✔ fbcfea79c1c4 Pull complete 1.3s
✔ b750f2521639 Pull complete 3.8s
✔ cda92632d61f Pull complete 3.9s
✔ 2ce425e35c79 Pull complete 4.0s
✔ f1f82ac6ad8d Pull complete 4.1s
✔ 9299ca8ed698 Pull complete 5.1s
✔ f3c4d7f3a9bb Pull complete 5.2s
✔ jenkins Pulled 17.5s
✔ b2b31b28ee3c Already exists 0.0s
✔ 09ceeed8fa1c Pull complete 11.6s
✔ 19ffe971b4b1 Pull complete 11.8s
✔ d3073edebc88 Pull complete 11.8s
✔ cbe4b9088bc7 Pull complete 11.8s
✔ 6247593ed994 Pull complete 12.8s
✔ 40b97309cacd Pull complete 12.8s
✔ 8a99a6e22ba3 Pull complete 12.9s
✔ b4e68d4601f6 Pull complete 13.9s
✔ 18c1dbc71d53 Pull complete 13.9s
✔ e44966ae9784 Pull complete 14.0s
✔ ada8f1c507ec Pull complete 14.0s
[+] Running 5/5
✔ Network cicd-labs_cicd-network Created 0.4s
✔ Volume "cicd-labs_jenkins_home" Created 0.0s
✔ Volume "cicd-labs_gogs-data" Created 0.0s
✔ Container gogs Started 1.5s
✔ Container jenkins Started 1.5s
[ssoon@localhost cicd-labs]$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
gogs gogs/gogs "/app/gogs/docker/st…" gogs 25 seconds ago Up 23 seconds (health: starting) 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:10022->22/tcp, [::]:10022->22/tcp
jenkins jenkins/jenkins "/usr/bin/tini -- /u…" jenkins 25 seconds ago Up 23 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp
- docker compose exec를 사용하여 실행 중인 두 컨테이너(gogs, jenkins)에 접근하고, 각 컨테이너 내에서 whoami와 pwd 명령을 실행하여 해당 컨테이너에서 현재 사용자와 작업 디렉터리를 확인합니다.
[ssoon@localhost cicd-labs]$ for i in gogs jenkins ; do echo ">> container : $i <<"; docker compose exec $i sh -c "whoami && pwd"; echo; done
>> container : gogs <<
root
/app/gogs
>> container : jenkins <<
jenkins
/
[ssoon@localhost cicd-labs]$ docker compose exec jenkins bash
jenkins@6040c315080f:/$ whoami
jenkins
[ssoon@localhost cicd-labs]$ docker compose exec gogs bash
6a58eedeb25b:/app/gogs# whoami
root
- Jenkins 컨테이너 내에 있는 initialAdminPassword 파일의 내용을 출력하는 명령어입니다. 이 파일은 Jenkins 설치 후, 초기 관리자 비밀번호를 담고 있으며, Jenkins 웹 UI에 처음 로그인할 때 사용됩니다.
[ssoon@localhost cicd-labs]$ docker compose exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
64daf6eead8e469bb1d89da4fe9c4c0b
- Admin 유저 생성
- Jenkins URL 설정
- 접속을 확인합니다.
🧿 Jenkins 컨테이너에서 호스트에 도커 데몬 사용 설정
DIND (Docker in Docker) vs DooD (Docker out of Docker)
개념 | Docker 컨테이너 내에서 Docker를 실행하는 방식 | Docker 컨테이너에서 호스트 Docker 데몬을 직접 접근하는 방식 |
구성 | Docker 컨테이너 내부에 Docker를 설치하여 사용 | Docker 컨테이너는 호스트 머신의 Docker 데몬과 통신 |
사용 예시 | CI/CD 파이프라인에서 Docker 컨테이너를 빌드할 때 사용 | Docker 컨테이너에서 호스트 시스템의 Docker를 사용해야 할 때 |
보안 | 보안상 이슈가 있을 수 있음 (컨테이너에서 Docker 데몬에 접근) | 보안상의 위험은 덜하지만 호스트와 컨테이너가 밀접하게 연결됨 |
성능 | Docker 데몬을 컨테이너 내에서 실행하므로 오버헤드 발생 가능 | 호스트에서 직접 Docker 데몬을 사용하므로 성능적으로 더 효율적 |
유스케이스 | 컨테이너 내에서 독립적인 Docker 환경이 필요할 때 | 호스트의 Docker를 그대로 사용하여 리소스를 절약할 때 |
설치 및 설정 | Docker 데몬을 컨테이너 내부에 설치하고 실행 | Docker 컨테이너에서 호스트 Docker 소켓을 공유하여 실행 |
장점 | 독립적이고 격리된 환경에서 Docker를 실행할 수 있음 | 호스트와 리소스를 공유하여 더 빠르고 간편한 설정 가능 |
단점 | Docker 데몬을 컨테이너 내에서 실행하는 것이 보안상 리스크가 될 수 있음 | 호스트 시스템에 의존적이므로 제한적인 환경에서는 문제가 될 수 있음 |
- jenkins 컨테이너 내에서 root 사용자 권한으로 bash 셸을 실행하고 docker 를 설합니다.
[ssoon@localhost cicd-labs]$ docker compose exec --privileged -u root jenkins bash
root@6040c315080f:/# id
uid=0(root) gid=0(root) groups=0(root)
root@6040c315080f:/# curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
root@6040c315080f:/# chmod a+r /etc/apt/keyrings/docker.asc
root@6040c315080f:/# echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
root@6040c315080f:/# apt-get update && apt install docker-ce-cli curl tree jq -y
Get:1 https://download.docker.com/linux/debian bookworm InRelease [43.3 kB]
Get:2 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:3 http://deb.debian.org/debian bookworm-updates InRelease [55.4 kB]
Get:4 http://deb.debian.org/debian-security bookworm-security InRelease [48.0 kB]
Get:5 https://download.docker.com/linux/debian bookworm/stable amd64 Packages [31.7 kB]
Get:6 http://deb.debian.org/debian bookworm/main amd64 Packages [8789 kB]
Get:7 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [2712 B]
Get:8 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [206 kB]
Fetched 9326 kB in 1s (6521 kB/s)
Reading package lists... Done
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
curl is already the newest version (7.88.1-10+deb12u8).
The following additional packages will be installed:
docker-buildx-plugin docker-compose-plugin libjq1 libonig5
The following NEW packages will be installed:
docker-buildx-plugin docker-ce-cli docker-compose-plugin jq libjq1 libonig5 tree
0 upgraded, 7 newly installed, 0 to remove and 1 not upgraded.
Need to get 58.4 MB of archives.
After this operation, 189 MB of additional disk space will be used.
Get:1 https://download.docker.com/linux/debian bookworm/stable amd64 docker-buildx-plugin amd64 0.17.1-1~debian.12~bookworm [30.3 MB]
Get:2 http://deb.debian.org/debian bookworm/main amd64 libonig5 amd64 6.9.8-1 [188 kB]
Get:3 http://deb.debian.org/debian bookworm/main amd64 libjq1 amd64 1.6-2.1 [135 kB]
Get:4 http://deb.debian.org/debian bookworm/main amd64 jq amd64 1.6-2.1 [64.9 kB]
Get:5 http://deb.debian.org/debian bookworm/main amd64 tree amd64 2.1.0-1 [52.5 kB]
Get:6 https://download.docker.com/linux/debian bookworm/stable amd64 docker-ce-cli amd64 5:27.3.1-1~debian.12~bookworm [15.0 MB]
Get:7 https://download.docker.com/linux/debian bookworm/stable amd64 docker-compose-plugin amd64 2.29.7-1~debian.12~bookworm [12.7 MB]
Fetched 58.4 MB in 1s (51.0 MB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package docker-buildx-plugin.
(Reading database ... 10537 files and directories currently installed.)
Preparing to unpack .../0-docker-buildx-plugin_0.17.1-1~debian.12~bookworm_amd64.deb ...
Unpacking docker-buildx-plugin (0.17.1-1~debian.12~bookworm) ...
Selecting previously unselected package docker-ce-cli.
Preparing to unpack .../1-docker-ce-cli_5%3a27.3.1-1~debian.12~bookworm_amd64.deb ...
Unpacking docker-ce-cli (5:27.3.1-1~debian.12~bookworm) ...
Selecting previously unselected package docker-compose-plugin.
Preparing to unpack .../2-docker-compose-plugin_2.29.7-1~debian.12~bookworm_amd64.deb ...
Unpacking docker-compose-plugin (2.29.7-1~debian.12~bookworm) ...
Selecting previously unselected package libonig5:amd64.
Preparing to unpack .../3-libonig5_6.9.8-1_amd64.deb ...
Unpacking libonig5:amd64 (6.9.8-1) ...
Selecting previously unselected package libjq1:amd64.
Preparing to unpack .../4-libjq1_1.6-2.1_amd64.deb ...
Unpacking libjq1:amd64 (1.6-2.1) ...
Selecting previously unselected package jq.
Preparing to unpack .../5-jq_1.6-2.1_amd64.deb ...
Unpacking jq (1.6-2.1) ...
Selecting previously unselected package tree.
Preparing to unpack .../6-tree_2.1.0-1_amd64.deb ...
Unpacking tree (2.1.0-1) ...
Setting up docker-buildx-plugin (0.17.1-1~debian.12~bookworm) ...
Setting up tree (2.1.0-1) ...
Setting up docker-compose-plugin (2.29.7-1~debian.12~bookworm) ...
Setting up docker-ce-cli (5:27.3.1-1~debian.12~bookworm) ...
Setting up libonig5:amd64 (6.9.8-1) ...
Setting up libjq1:amd64 (1.6-2.1) ...
Setting up jq (1.6-2.1) ...
Processing triggers for libc-bin (2.36-9+deb12u9) ...
root@6040c315080f:/# docker info
Client: Docker Engine - Community
Version: 27.3.1
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.17.1
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.29.7
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 2
Running: 2
Paused: 0
Stopped: 0
Images: 12
Server Version: 27.3.1
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: systemd
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
Swarm: inactive
Runtimes: runc io.containerd.runc.v2
Default Runtime: runc
Init Binary: docker-init
containerd version: 88bf19b2105c8b17560993bee28a01ddc2f97182
runc version: v1.2.2-0-g7cb3632
init version: de40ad0
Security Options:
seccomp
Profile: builtin
cgroupns
Kernel Version: 5.14.0-427.13.1.el9_4.x86_64
Operating System: Rocky Linux 9.4 (Blue Onyx)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.489GiB
Name: localhost.localdomain
ID: 61bff9fc-e42f-411a-89a6-315a7cd61a4d
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
root@6040c315080f:/# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6040c315080f jenkins/jenkins "/usr/bin/tini -- /u…" 12 minutes ago Up 12 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins
6a58eedeb25b gogs/gogs "/app/gogs/docker/st…" 12 minutes ago Up 12 minutes (healthy) 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:10022->22/tcp, [::]:10022->22/tcp gogs
root@6040c315080f:/# which docker
/usr/bin/docker
- Jenkins 컨테이너 내부에서 root가 아닌 jenkins 유저도 docker를 실행할 수 있도록 권한을 부여합니다.
root@6040c315080f:/# groupadd -g 2000 -f docker
root@6040c315080f:/# chgrp docker /var/run/docker.sock
root@6040c315080f:/# ls -l /var/run/docker.sock
srw-rw----. 1 root docker 0 Dec 2 12:01 /var/run/docker.sock
root@6040c315080f:/# usermod -aG docker jenkins
root@6040c315080f:/# cat /etc/group | grep docker
docker:x:2000:jenkins
root@6040c315080f:/# exit
exit
[ssoon@localhost cicd-labs]$
- "permission denied" 오류가 발생
[ssoon@localhost cicd-labs]$ docker ps
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.47/containers/json": dial unix /var/run/docker.sock: connect: permission denied
[ssoon@localhost cicd-labs]$ docker compose restart jenkins
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.47/containers/json?all=1&filters=%7B%22label%22%3A%7B%22com.docker.compose.config-hash%22%3Atrue%2C%22com.docker.compose.oneoff%3DFalse%22%3Atrue%2C%22com.docker.compose.project%3Dcicd-labs%22%3Atrue%7D%7D": dial unix /var/run/docker.sock: connect: permission denied
Docker 소켓 파일의 권한 재설정
- 호스트의 /var/run/docker.sock 권한을 다시 설정하여 문제를 해결할 수 있습니다:
- /var/run/docker.sock에 모든 사용자 접근 권한을 임시로 부여:
[ssoon@localhost cicd-labs]$ sudo chmod 666 /var/run/docker.sock
[sudo] ssoon의 암호:
⚠️ 보안 경고: chmod 666은 모든 사용자에게 Docker 소켓 접근 권한을 부여하므로, 테스트 후 반드시 권한을 660으로 되돌리세요:
- 이후 Jenkins 및 Docker 명령 테스트.
[ssoon@localhost cicd-labs]$ docker compose exec jenkins docker info
Client: Docker Engine - Community
Version: 27.3.1
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.17.1
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.29.7
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 2
Running: 2
Paused: 0
Stopped: 0
Images: 12
Server Version: 27.3.1
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: systemd
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 88bf19b2105c8b17560993bee28a01ddc2f97182
runc version: v1.2.2-0-g7cb3632
init version: de40ad0
Security Options:
seccomp
Profile: builtin
cgroupns
Kernel Version: 5.14.0-427.13.1.el9_4.x86_64
Operating System: Rocky Linux 9.4 (Blue Onyx)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.489GiB
Name: localhost.localdomain
ID: 61bff9fc-e42f-411a-89a6-315a7cd61a4d
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
[ssoon@localhost cicd-labs]$ docker compose exec jenkins docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc368b58aec0 jenkins/jenkins "/usr/bin/tini -- /u…" 9 minutes ago Up 6 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins
f940f826d2c3 gogs/gogs "/app/gogs/docker/st…" 9 minutes ago Up 9 minutes (healthy) 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:10022->22/tcp, [::]:10022->22/tcp gogs
- Gogs 컨테이너 초기 설정합니다.
- 데이터베이스 유형 : SQLite3
- 애플리케이션 URL : http://<각자 자신의 PC IP>:3000/
- 기본 브랜치 : main
- 관리자 계정 설정 클릭 : 이름(계정명 - 닉네임 사용 devops), 비밀번호(계정암호 qwe123), 이메일 입력
- docker compose exec gogs ls -l /data:
- gogs 데이터 디렉토리의 파일들에 대한 정보를 확인합니다.
- docker compose exec gogs ls -l /data/gogs:
- gogs의 주요 데이터 폴더에 대한 내용을 확인하는 데 사용됩니다.
- docker compose exec gogs ls -l /data/gogs/conf:
- gogs의 설정 파일들이 위치한 폴더의 내용을 보여줍니다.
- docker compose exec gogs cat /data/gogs/conf/app.ini:
- gogs 컨테이너에서 app.ini 파일의 내용을 확인합니다.
- app.ini 파일은 gogs의 주요 설정 파일 중 하나로, Gogs의 동작을 제어하는 중요한 설정들을 포함하고 있습니다.
[ssoon@localhost cicd-labs]$ docker compose exec gogs ls -l /data
total 4
drwxr-xr-x 4 git git 61 Dec 2 14:29 git
drwxr-xr-x 5 git git 41 Dec 2 12:57 gogs
drwx------ 2 git git 4096 Dec 2 12:57 ssh
[ssoon@localhost cicd-labs]$ docker compose exec gogs ls -l /data/gogs
total 0
drwxr-xr-x 2 git git 21 Dec 2 14:29 conf
drwxr-xr-x 2 git git 21 Dec 2 14:29 data
drwxr-xr-x 2 git git 54 Dec 2 14:29 log
[ssoon@localhost cicd-labs]$ docker compose exec gogs ls -l /data/gogs/conf
total 4
-rw-r--r-- 1 git git 953 Dec 2 14:29 app.ini
[ssoon@localhost cicd-labs]$ docker compose exec gogs cat /data/gogs/conf/app.ini
BRAND_NAME = Gogs
RUN_USER = git
RUN_MODE = prod
[database]
TYPE = sqlite3
HOST = 127.0.0.1:5432
NAME = gogs
SCHEMA = public
USER = gogs
PASSWORD =
SSL_MODE = disable
PATH = data/gogs.db
[repository]
ROOT = /data/git/gogs-repositories
DEFAULT_BRANCH = main
[server]
DOMAIN = localhost
HTTP_PORT = 3000
EXTERNAL_URL = http://192.168.56.105:3000/
DISABLE_SSH = false
SSH_PORT = 22
START_SSH_SERVER = false
OFFLINE_MODE = false
[email]
ENABLED = false
[auth]
REQUIRE_EMAIL_CONFIRMATION = false
DISABLE_REGISTRATION = false
ENABLE_REGISTRATION_CAPTCHA = true
REQUIRE_SIGNIN_VIEW = false
[user]
ENABLE_EMAIL_NOTIFICATION = false
[picture]
DISABLE_GRAVATAR = false
ENABLE_FEDERATED_AVATAR = false
[session]
PROVIDER = file
[log]
MODE = file
LEVEL = Info
ROOT_PATH = /app/gogs/log
[security]
INSTALL_LOCK = true
SECRET_KEY = 1fhmqnciVfMru5s
- 토큰을 생성합니다.
- Settings → Applications : Generate New Token 클릭 - Token Name(devops) ⇒ Generate Token 클릭
- 새로운 Repository 를 생성합니다.
- Repository Name : dev-app
- Visibility : (Check) This repository is Private
- .gitignore : Python
- Readme : Default → (Check) initialize this repository with selected files and template
- Repo 주소 확인합니다.
- git 을 설치하고 설정합니다.
[ssoon@localhost cicd-labs]$ sudo dnf install git -y
[ssoon@localhost cicd-labs]$ git config --global user.name "devops"
[ssoon@localhost cicd-labs]$ git config --global user.email "admin@example.com"
[ssoon@localhost cicd-labs]$ git clone http://192.168.56.105:3000/devops/dev-app.git
'dev-app'에 복제합니다...
Username for 'http://192.168.56.105:3000': devops
Password for 'http://devops@192.168.56.105:3000':
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
오브젝트 묶음 푸는 중: 100% (4/4), 696 bytes | 696.00 KiB/s, 완료.
[ssoon@localhost cicd-labs]$ tree dev-app
dev-app
└── README.md
0 directories, 1 file
[ssoon@localhost cicd-labs]$ cd dev-app
[ssoon@localhost dev-app]$ git branch
* main
[ssoon@localhost dev-app]$ git remote -v
origin http://192.168.56.105:3000/devops/dev-app.git (fetch)
origin http://192.168.56.105:3000/devops/dev-app.git (push)
- server.py 파일 작성 & Dockerfile 생성 & VERSION 파일 생성
[ssoon@localhost dev-app]$ cat > server.py <<EOF
from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler
from datetime import datetime
class RequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
now = datetime.now()
response_string = now.strftime("The time is %-I:%M:%S %p, CloudNeta Study.\n")
self.wfile.write(bytes(response_string, "utf-8"))
def startServer():
try:
server = ThreadingHTTPServer(('', 80), RequestHandler)
print("Listening on " + ":".join(map(str, server.server_address)))
server.serve_forever()
except KeyboardInterrupt:
server.shutdown()
if __name__== "__main__":
startServer()
EOF
[ssoon@localhost dev-app]$ cat > Dockerfile <<EOF
FROM python:3.12
ENV PYTHONUNBUFFERED 1
COPY . /app
WORKDIR /app
CMD ["python3", "server.py"]
EOF
[ssoon@localhost dev-app]$ echo "0.0.1" > VERSION
- 변경 사항을 스테이지에 추가 (git add .)
- 변경 사항을 로컬 Git 저장소에 커밋 (git commit -m "Add dev-app")
- 로컬 변경 사항을 원격 저장소에 푸시 (git push -u origin main)
[ssoon@localhost dev-app]$ git status
현재 브랜치 main
브랜치가 'origin/main'에 맞게 업데이트된 상태입니다.
추적하지 않는 파일:
(커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
Dockerfile
VERSION
server.py
커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "git
add"를 사용하십시오)
[ssoon@localhost dev-app]$ git add .
[ssoon@localhost dev-app]$ git status
현재 브랜치 main
브랜치가 'origin/main'에 맞게 업데이트된 상태입니다.
커밋할 변경 사항:
(use "git restore --staged <file>..." to unstage)
새 파일: Dockerfile
새 파일: VERSION
새 파일: server.py
[ssoon@localhost dev-app]$ git commit -m "Add dev-app"
[main f180896] Add dev-app
3 files changed, 28 insertions(+)
create mode 100644 Dockerfile
create mode 100644 VERSION
create mode 100644 server.py
[ssoon@localhost dev-app]$ git status
현재 브랜치 main
브랜치가 'origin/main'보다 1개 커밋만큼 앞에 있습니다.
(로컬에 있는 커밋을 제출하려면 "git push"를 사용하십시오)
커밋할 사항 없음, 작업 폴더 깨끗함
[ssoon@localhost dev-app]$ git push -u origin main
Username for 'http://192.168.56.105:3000': devops
Password for 'http://devops@192.168.56.105:3000':
오브젝트 나열하는 중: 6, 완료.
오브젝트 개수 세는 중: 100% (6/6), 완료.
Delta compression using up to 4 threads
오브젝트 압축하는 중: 100% (4/4), 완료.
오브젝트 쓰는 중: 100% (5/5), 868 bytes | 868.00 KiB/s, 완료.
Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
To http://192.168.56.105:3000/devops/dev-app.git
cead6a3..f180896 main -> main
branch 'main' set up to track 'origin/main'.
[ssoon@localhost dev-app]$ git status
현재 브랜치 main
브랜치가 'origin/main'에 맞게 업데이트된 상태입니다.
커밋할 사항 없음, 작업 폴더 깨끗함
- Gogs Repo 에서 확인합니다.
- 도커 허브 계정에 dev-app (Private) repo 을 생성합니다.
'CICD 맛보기' 카테고리의 다른 글
1주 : Jenkins CI/CD + Docker : 4 (2) | 2024.12.05 |
---|---|
1주 : Jenkins CI/CD + Docker : 3 (0) | 2024.12.04 |
1주 : Jenkins CI/CD + Docker : 1 (0) | 2024.12.02 |
Comments