본문 바로가기
Docker

[CI구축] Docker - Github Action - DockerHub

by moveho 2023. 4. 4.

다음과 같은 FlowAWS EC2에서 Git push를 하게 된다면 연결된 git repogit action (Work flow, Jobs)를 통해 Docker hub에 새로운 버전으로 업데이트 해주는 과정을 구현해 보았다.

개발을 한다면, 다음과 같은 세팅을 해 두고 시작한다면 편한 작업 환경을 가질 수 있을 것 같다.

 

1. AWS EC2 Docker 설치

# 도커 설치 #

// 도커 설치

sudo yum install docker -y

 

// 도커 실행

sudo service docker start

 

// 도커 상태 확인

systemctl status docker.service

 

// Docker 관련 권한 추가

sudo chmod 666 /var/run/docker.sock

docker ps

 

// 도커 컴포즈 설치

sudo curl \\

-L "<https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$>(uname -s)-$(uname -m)" \\

-o /usr/local/bin/docker-compose

 

// 권한 추가

sudo chmod +x /usr/local/bin/docker-compose

 

// 버전 확인

docker-compose --version

 

2. 도커 권한 설정 및 컴포즈 설치

docker-compose 오류 해결

[root@ip-172-31-40-246 ~]# docker-compose --version

[27511] Error loading Python lib '/tmp/_MEINg29lk/libpython3.7m.so.1.0': dlopen: libcrypt.so.1: cannot open shared object file: No such file or directory

 

## 다음 코드로 해결

[root@ip-172-31-40-246 ~]# sudo yum install -y libxcrypt-compat

3. docker ci를 위한 node기반 Test application 생성

## Dockerfile

 

 

FROM node:4.2

COPY . /src

RUN cd /src && npm install

EXPOSE 4000

CMD ["node", "/src/server.js"]

 

 

## package.json

 

{

    "name": "docker-test",

    "version": "1.0.0",

    "description": "",

    "main": "server.js",

    "scripts": {

      "test": "echo \"Error: no test specified\" && exit 1",

      "start": "node server.js"

    },

    "author": "Ritesh Yadav",

    "license": "ISC"

  }

 

## server.js

 

var http = require('http')

 

var port = 4000

 

var server = http.createServer(function (request, response) {

  response.writeHead(200, {'Content-Type': 'text/plain'})

  response.end('Hello World, docker ci test \n')

})

 

server.listen(port)

 

console.log('Server running at http://localhost:' + port)

 

## 간단한 web application

 

4. Docker Push

## Docker Push

[root@ip-172-31-40-246 github-action-docker]# sudo docker push moveho/ci:1.0

The push refers to repository [docker.io/moveho/ci]

fc57a026f5be: Preparing

5f70bf18a086: Preparing

fa21271fd1f7: Preparing

cfad146009ce: Preparing

3d9a7bde211f: Preparing

656120ad8c56: Waiting

30f9a83f20f3: Waiting

78dbfa5b7cbc: Waiting

denied: requested access to the resource is denied  #에러 발생

[root@ip-172-31-40-246 github-action-docker]# docker login  # 로그인으로 해결

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.

Username: moveho

Password:

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

 

Login Succeeded

[root@ip-172-31-40-246 github-action-docker]#

[root@ip-172-31-40-246 github-action-docker]# sudo docker push moveho/ci:1.0

The push refers to repository [docker.io/moveho/ci]

fc57a026f5be: Pushed

5f70bf18a086: Mounted from library/node

fa21271fd1f7: Mounted from library/node

cfad146009ce: Mounted from library/node

3d9a7bde211f: Mounted from library/node

656120ad8c56: Mounted from library/node

30f9a83f20f3: Mounted from library/node

78dbfa5b7cbc: Mounted from library/node

1.0: digest: sha256:7fded78d68f3f098e03f7334dcc79726c6d41821ea5230578fe06eb211f424f8 size: 2620

5. Git push

 

[root@ip-172-31-40-246 Docker-CI]# git add Dockerfile package.json server.js

[root@ip-172-31-40-246 Docker-CI]# git commit -m "my docker ci test"

[master (root-commit) 9d377ad] my docker ci test

 Committer: root <root@ip-172-31-40-246.ap-northeast-2.compute.internal>

Your name and email address were configured automatically based

on your username and hostname. Please check that they are accurate.

You can suppress this message by setting them explicitly. Run the

following command and follow the instructions in your editor to edit

your configuration file:

 

 3 files changed, 29 insertions(+)

 create mode 100644 Dockerfile

 create mode 100644 package.json

 create mode 100644 server.js

 

root@ip-172-31-40-246 Docker-CI]# git push

Username for 'https://github.com': MachDn

Password for 'https://MachDn@github.com':

remote: Support for password authentication was removed on August 13, 2021.

remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.

fatal: Authentication failed for 'https://github.com/MachDn/Docker-CI.git/'

# [에러 발생] 토근을 발급 받아야 됩니다.

 

다음과 같이 push 완료

 

 

6. Git action Workflow작성

[워크플로우 작성]
name: Push Docker Image to Docker Hub

on:
  push:
    branches: [master]

jobs:
  push:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1

      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_PASSWORD }}

      - name: Build and push Docker Image
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          tags: |
            moveho/ci:latest
            moveho/ci:${{ github.sha }}

7. Secret 생성

 

시크릿은 NameKEY Secret VALUE 값 형태로 넣어주면 된다.

비밀번호도 동일한 방식으로 올바른 KEY값과 함께 Secret을 생성해주면 된다.

 

8. Git action을 통한  버전 업데이트 (push)

올바른 시크릿과, 워크플로우 작성을 했다면 알맞게 도커에서 수정사항이 도커 허브로 새로운 버전으로 업데이트 되는 것을 볼 수 있다!

 

8.Test (Docker -> git push -> docker hub)

## 소스코드 변경

 

## 변경사항 gitpush

## 확인

## Push 감지후 자동으로 Gitaction 실행

## Git workflow 확인

정상 실행 완료 확인.

 

 

## Docker Hub 이미지 푸시 확인

9. 변경 사항 적용 및 배포 확인

[root@ip-172-31-40-246 Docker-CI]# docker run -p 4000:4000 moveho/ci:1a9eb5f6e200f63f0a64bd1dd8a00e3705aefbc6

## 최신 푸시 이미지로 컨테이너 실행 확인

## 변경사항 적용된 상태로 배포 성공 확인

10. 프로젝트 플로우 정리 및 회고

이로서, 다음과 같은 FlowAWS EC2에서 Git push를 하게 된다면 연결된 git repogit action (Work flow, Jobs)를 통해 Docker hub에 새로운 버전으로 업데이트 해주는 과정을 구현해 보았다.

개발을 한다면, 다음과 같은 세팅을 해 두고 시작한다면 편한 작업 환경을 가질 수 있을 것 같다.

댓글