소마에서 15기를 모집한다고 합니다!

저는 12기 연수생이라 벌써 3년이 지났는데요...(뭔데 벌써 15기지..?)

항상 생각하는거지만, 지금까지 대학생활을 해오면서, 커리어를 쌓고, 대회를 나가고 하면서 가장 큰 도움이 되었다고 생각한 활동이 바로 소프트웨어 마에스트로입니다.

 

내가 왜 이 프로젝트를 추천하는가?

본인의 노력에 달린 것이긴 하지만, 창업에 가까운 완성도의 프로젝트를 어마무시하신 멘토님들의 도움을 받아서, 비용도 지원받고 진행할 수 있는 최고의 기회입니다. 본인이 대학생인데, 아직 해본적이 없다 하면 무조건 신청해서 도전해보시는걸 추천드려요!

13기부터인가는 Expert라고 수료생들이 지원해서 프로젝트를 도와주는 것도 생겼다고 하는데, 그러면 제가 했던 프로젝트보다 훨씬 좋은 것들을 만들 수 있지 않을까요??

 

진짜 이건 무조건... 무조건 해야합니다...

누군가에겐 엄청난 인생의 전환점이 될 수 있는 활동인 소프트웨어 마에스트로 무조건 해보시길 추천드립니다!

 

https://blog.naver.com/sw_maestro/223317886225

 

SW마에스트로 제15기 연수생 모집

안녕하세요. 드디어! 소프트웨어 마에스트로 제15기 연수생 모집이 시작되었습니다! 모집에 관련된 내용을 ...

blog.naver.com

 

'공지' 카테고리의 다른 글

카테고리 선택할 때..  (0) 2020.04.16
2020.04.10. Tistory로 넘어왔습니다.  (0) 2020.04.16

점수가 떨어졌다. 엌ㅋㅋㅋ
자료 구조의 응용이 부족하다고...

처음에 문제 풀다가 그냥 에라 모르겠다 하면서 부르트포스로 풀었는데, 시간초과 떠서 딕셔너리 고민하다가 구현하는데, 문제풀이 시간이 초과되어버렸다 ㅋㅋㅋㅋㅋ 아... 시간 좀만 더 주지...

그러고나서 어떤 부분이 부족했는지 보니... 문제풀이는 딕셔너리로 하는게 맞았던거같다. 딕셔너리를 공부하라네...

 

https://inha.codetree.ai/landing/level-test/5352/result/4?&utm_source=clipboard&utm_medium=text 

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

이 문제를 추천해줬다.

빠르게 한번 풀어보자

빠르게 풀어보고, 딕셔너리를 잘 떠올릴 수 있도록 해야겠다~

 

n = int(input())
data = dict()

for i in range(n): 
    command = input().split()

    if command[0] == "add":
        a, b = int(command[1]), int(command[2])
        data[a] = b
    elif command[0] == "remove":
        a = int(command[1])
        del(data[a])
    else:
        a = int(command[1])
        if a not in data:
            print("None")
        else:
            print(data[a])

정답입니다~

일단 지금은 총 5개의 컨테이너를 올렸습니다.

Node: server 구성 (통신을 위해 포트 할당)

Python: 데이터 분석용 (통신을 위해 포트 할당)

Neo4j: GraphDB로 대량의 데이터 저장 (기본적으로 2개의 포트를 사용함)

Mysql: 사용자 데이터 저장 (기본적으로 1개의 포트를 사용함)

Adminer: Mysql 관리용

 

이렇게 5개의 컨테이너를 올렸으며 아래의 명령어를 사용했습니다.

명령어 중 {Command}와 같은 정보는 가린 데이터이며, 적절한 값을 넣어주시면 됩니다.

모든 옵션을 사용하지 않아도 됩니다.

 

-v에서 Host 부분은 모두 volume을 생성해서 진행하였습니다.

이렇게 진행을 하면 기본적으로 bridge 라는 네트워크 구성에 모두 포함되게 됩니다.

docker network inspect bridge

위의 명령어로 해당 네트워크의 정보를 확인할 수 있습니다.

 

  • Node docker run

docker run -d -it

--name {con_name}

--restart always

--workdir="{Dir}"

-v server:{Dir}

-p {HostPort}:{ContainerPort}

--entrypoint /bin/bash

node:{version}

 

  • Python docker run

docker run -d -it

--name {con_name}

--restart always

--workdir="{Dir}" 

-v server:{Dir}

-p {HostPort}:{ContainerPort}

--entrypoint /bin/bash

python:{version}

 

  • Neo4j docker run ( port 7474, bolt 7687 )

docker run -d -it

--name {con_name}

--restart always

-v neo4j:{Dir}

-p {HostPort}:7474

-p {HostPort}:7687

neo4j:{version}

 

  • Mysql docker run ( port 3306 )

docker run -d -it

--name {con_name}

--restart always

-v mysql:{Dir}

-e MYSQL_ROOT_PASSWORD={PassWord}

-p {HostPort}:3306

mysql:{version}

 

  • Adminer docker run ( port 7080 )

docker run -d -it

--name {con-name}

--restart always

-p {HostPort}:8080

adminer:{version}

'Server' 카테고리의 다른 글

Docker run 명령어 정리  (1) 2021.07.27
Ubuntu Server 20.04 lts Setting  (0) 2021.07.23

이번에는 docker compose 작업하다가 잘 안돼서 그냥 빠르게 docker run 작업으로 다 올려버린 내용을 정리할겁니다.

 

https://docs.docker.com/engine/reference/commandline/run/

 

docker run

docker run: The `docker run` command first `creates` a writeable container layer over the specified image, and then `starts` it using the specified command. That is, `docker run` is equivalent...

docs.docker.com

 

docker run에서의 command의 종류는 대충 제가 생각했을 때 중요한것만 보면 이렇게 있습니다.

  • --interactive or -i
  • --tty or -t
  • --detach or -d
  • --name
  • --publish or -p
  • --restart
  • --workdir or -w
  • --volume or -v
  • --env or -e
  • --entrypoint
  • --link

제가 중요하다고 생각한 기준은 이번 구성할때 사용했는가, 검색을 했을때 많이 보였는가와 같은 주관적인 질문의 결과입니다. ㅎㅎ

 

암튼 하나씩 설명을 해 드리자면

 

  • --interactive or -i

Keep STDIN open even if not attached

  • --tty or -t

Allocate a pseudo-TTY

 

위의 두가지 -i, -t는 같이 쓰이는 경우가 대부분이며 같이 쓸 경우 -it와 같이 사용할 수도 있습니다.(아마 99.99%는 이렇게 쓰지 않을까 생각합니다... ㅋㅋ)

그리고 이 두가지는 컨테이너를 종료하지 않고 터미널의 데이터를 컨테이너로 전달하기 위해 사용하는 옵션이라고 합니다...

자세한건 저도 잘 모르겠으니까 이 두가지는 필수라고 생각하고 넘어가도 되지 않을까요..? ㅎㅎ

 

  • --detach or -d

docker run -d ubuntu- ubuntu 이미지를 사용해서 컨테이너를 올릴건데, 백그라운드로 실행하겠다.

Run container in background and print container ID

컨테이너(container)를 run 시켰을 때 -d 옵션이 있다면 백그라운드(background)에서 실행되게 됩니다. 일반적으로 컨테이너를 실행시키게 되면 command 부분에 입력된 명령을 바로 진행하게 되는데, 이 경우 작업하고 있던 터미널에서 로그(log)가 출력되거나, welcome 메시지와 같은 컨테이너가 출력하고자 하는 명령이 보이는 경우가 많습니다. 또한 python의 경우 일반적으로 python3 명령어가 실행되어 컨테이너를 실행시켰을 때 파이썬 창이 뜨는 경우도 있죠. 이것을 막고자 백그라운드에서 실행시키게 됩니다.

저는 이 명령어를 모든 컨테이너에 써줬는데, 일단 컨테이너만 올리고 설정은 차차 진행할것이기 때문입니다.

 

  • --name

docker run --name ubuntu-con ubuntu

- ubuntu 이미지를 사용해서 컨테이너를 올릴건데, 이름을 ubuntu-con으로 정하겠다.

Assign a name to the container

컨테이너의 이름을 설정해 줄 수 있습니다. docker run을 통해서 컨테이너를 올렸을 때 이를 설정해주지 않으면 랜덤으로 이름이 주어지게 됩니다. 컨테이너간의 통신에서 주소대신 해당 이름이 사용되기도 한다니까, 이름 설정할 때 알아보기 쉽게 설정하면 좋겠죠?

 

  • --publish or -p

docker run -p 8080:7080/tcp ubuntu

- ubuntu 이미지를 사용해서 컨테이너를 올릴건데, 포트를 tcp방식으로 외부에서 8080포트로 들어오면 컨테이너에서는 7080포트로 사용겠다. ( 포트포워딩 ) 

Publish a container's port(s) to the host

컨테이너에서 사용할 포트를 설정해줄 수 있습니다. {public port}:{container port}/protocol 의 형식으로 사용되며, public port로 데이터가 들어왔을 때 포트포워딩이 진행되어 container port로 전송되게 됩니다. protocol은 udp, tcp와 같은 여러 종류가 있지만, 기본적으로 tcp로 동작이 되며 굳이 작성 안해도 됩니다. -p 8080:7080 까지만 작성해도 어지간한 작업은 모두 진행할 수 있으니 그냥 모르겠다 싶은 사람들은 이렇게만 사용해주셔도 됩니다.아 참고로 여러개의 포트를 연결하고 싶을 때에는 -p 옵션을 여러번 써주시면 됩니다.

 

  • --restart

docker run --restart always ubuntu

- ubuntu 이미지를 사용해서 컨테이너를 올릴건데, 항상 재시작 하겠다.

Restart policy to apply when a container exits

컨테이너가 종료되었을 때 재시작 할것인지 정하는 옵션입니다. 기본적으로 이 부분을 작성하지 않으면 no 상태로 재시작시키지 않지만, 서버의 경우에는 종료되어도 항상 재시작 되어있어야하기 때문에 always나 unless-stopped를 많이 쓰는것 같습니다. 아래의 설명은 restart 옵션의 종류입니다.

- no: 컨테이너를 재시작 X (기본)

- on-failure[:max-retries]: 컨테이너가 정상적으로 종료되지 않은 경우 exit가 0이 아닐때만 재시작. max-retries로 최대 재시작 횟수를 설정할 수 있음

- always: 컨테이너를 exit code에 상관 없이 항상 재시작.

- unless-stopped: 컨테이너를 stop시키기 전까지 항상 재시작.

 

  • --workdir or -w

docker run --workdir /src python- python 이미지를 사용해서 컨테이너를 올릴건데, 작업을 /src 에서 진행하겠다.

Working directory inside the container

working directory, 즉 작업공간을 설정하는 옵션입니다. 굳이 필요하지는 않지만, bash로 들어갔을 때 해당 디렉토리로 이동하게 됩니다. 전 이 directory를 volume과 함께 연결해서 사용했습니다. 참고로 해당 폴더가 없다면 자동으로 생성하게 됩니다. 이거 때문에 volume과 함께 사용했습니다.

 

  • --volume or -v

docker run --workdir /src --volume {HOSTDIR}:/src node- python 이미지를 사용해서 컨테이너를 올릴건데, 작업을 /src에서 진행할거고 {HOSTDIR}과 이 /src 폴더를 동기화시켜서 사용하겠다.

Bind mount a volume

volume을 mount 합니다. 말 그대로 host 폴더와 컨테이너 폴더를 동기화시켜서 사용할 있습니다. 저렇게 작성하게 되면 HOSTDIR의 파일과 /src의 파일이 동일하게 구성됩니다. volume을 /var/lib/docker/volumes와 같은 기본적으로 docker volume이 저장되는 곳에 docker volume create {볼륨이름} 처럼 해서 만들어서 사용할 수도 있고, 이 방법이 제일 권장되기는 하지만, 귀찮다면 그냥 이렇게 해도 되는 것 같습니다. 아직까진 문제를 발견하지를 못했... 참고로 저는 맥 환경에서는 귀찮아서 제 폴더로 연결시켜서 진행했고, 서버에서는 volume을 만들어서 진행했습니다. mount 방법도 3가지인가 있었던거같은데, 저는 본 프로젝트에서는 그 방식을 사용하지는 않았으므로 일단은 넘어가겠습니다

-언젠가 설명하겠지-

 

  • --env or -e

docker run -e MYSQL_ROOT_PASSWORD=1234 mysql- mysql 이미지를 사용해서 컨테이너를 올릴건데, MYSQL_ROOT_PASSWORD라는 환경변수의 값을 1234로 설정하겠다.

Set environment variables

그냥 컨테이너 내부에 환경변수를 설정하는 부분입니다. 일반적으로 docker hub에서 이미지의 설명 내용을 보면 각 환경변수가 어떤것을 나타내는지에 대한 설명이 존재합니다. mysql같은 경우는 MYSQL_ROOT_PASSWORD라는 환경변수의 값이 DB의 비밀번호라는 정보를 주었기 때문에, 이를 통해서 컨테이너를 올릴때 비밀번호를 설정하고 실행할 수 있습니다.이부분도 여러개의 환경변수를 설정해주기 위해서는 -e를 여러번 써주시면 됩니다.

 

  • --entrypoint

Overwrite the default ENTRYPOINT of the image

이부분에 대한 설명은 뭔가 하기가 어렵네요... ㅎ 그냥 링크로 대체하겠습니다 ㅠ

https://bluese05.tistory.com/77

 

Dockerfile Entrypoint 와 CMD의 올바른 사용 방법

ENTRYPOINT 와 CMD 는 무엇인가  ENTRYPOINT 와 CMD는 해당 컨테이너가 수행하게 될 실행 명령을 정의하는 선언문이다.  즉, 컨테이너가 무슨 일을 하는지 결정하는 최종 단계를 정의하는 명령이라고 생

bluese05.tistory.com

 

  • --link

Add link to another container

이 옵션은 도커 레퍼런스에서는 사용을 권장하고 있지는 않습니다. 그냥 컨테이너를 특정한 별명으로 부르겠다! 라는 설정인데... 그냥 컨테이너 이름으로 접근하거나, ip로 접근하는게 더 낫다고 합니다. 따라서 설명을 길게 하지는 않겠습니다. 공식 사이트에서 하지 말라는건 이유가 있는 법이니까요... 근데, 설명하고 있는 사이트가 많아서 일단 넣기는 했습니다.

'Server' 카테고리의 다른 글

서버에 올린 Docker Container 정리  (0) 2021.07.27
Ubuntu Server 20.04 lts Setting  (0) 2021.07.23

프로젝트를 진행하면서 서버를 구축해야하는데, 이번 기회에 명령어를 사용하면서 하나씩 정리해보고자 합니다.

 

aws에서 서버를 대여하여 사용하고 있으며

서버에서 사용자 계정을 하나 만들고

사용자의 기본 폴더에서 volumes를 공유한 docker container를 docker compose를 통해 설치할 예정입니다.

그리고 최종적으로 공유된 volumes를 git에 push하는 활동까지 진행할 계획입니다.

 

- 존재하는 패키지의 최신버전이 있는지 모두 탐색

sudo apt-get update

*apt, apt-get의 차이는 거의 없음. 그냥 apt-get을 쓰자. 굳이 말하자면 차이가 있기는 한데, apt-get이 더 안정적이다.

 

- 존재하는 패키지를 최신버전으로 업그레이드

sudo apt-get upgrade
sudo apt-get dist-upgrade # 설치하는 패키지의 의존성도 검사

*의존성 검사 -> upgrade와 달리 dist-upgrade는 해당 패키지에 의존적인 추가 패키지도 설치

 

- 서버 기준시간 변경

sudo dpkg-reconfigure tzdata # Asia-Seoul로 변경

 

-root 비밀번호 설정

sudo passwd root

 

- hostname 변경

vi /etc/hostname # 파일 내용이 hostname

* 파일 내용을 원하는 이름으로 바꾸면 됨

sudo hostname -F /etc/hostname # 변경사항 적용

 

- ssh 로그인 시 root 권한

https://hwanine.github.io/vs%20code/VSCode2/

 

VS Code를 이용한 원격 서버 디렉토리 접근법 - (2)

VS Code를 이용한 원격 서버 디렉토리 접근 방법

hwanine.github.io

 

- 네트워크 관련 tools

sudo apt-get install net-tools

*ifconfig, netstat와 같은 네트워크 명령어를 사용할 수 있음

 

- unzip 설치

sudo apt-get install unzip

* zip파일 압축을 풀 수 있음

 

- 사용자 추가

sudo adduser <username>

*<username>에 추가할 사용자 이름을 입력하면 됨. 이후 PW를 물어보고 추가 정보를 물어보니 적당히 입력

 

- docker 설치

# 필요한 패키지 설치
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
# Docker GPG key 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add
# OK 결과값이 나옴

* apt-transport-https: 패키지 관리자가 http를 통해 데이터 및 패키지에 접근할 수 있도록 함

* ca-certificates: 디지털 서명

* curl: 사이트에서 데이터 통신을 위해 사용

* gnupg: GNU Privacy Guard, 신뢰할 수 없는곳에 파일을 배포하기 위한 서명, 증명, 암호화, 해독을 위해 사용

* lsb-release: Linux Standard Base-release: 설치한 패키지의 정보를 자세하기 보기 위해 사용

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
apt-cache policy docker-ce # docker-ce라는 패키지가 설치되어있는지 확인
sudo apt install docker-ce
sudo systemctl status docker # docker 서비스의 상태를 확인
# docker 실행 확인과정
docker pull hello-world # hello-world image 받아오기
docker images
docker run hello-world # hello-world image 컨테이너에 올리고 실행하기
docker ps -a
docker rm <container id> # <container-id>에 해당하는 컨테이너 삭제하기
docker rm images
docker rmi hello-world # hello-world image 삭제하기

* 참고사이트

https://roseline124.github.io/kuberdocker/2019/07/17/docker-study02.html

https://blog.dalso.org/linux/ubuntu-20-04-lts/13118

https://docs.docker.com/engine/install/ubuntu/

 

 

아래는 docker-compose 설치하는 내용이지만, 열심히 yml 작성해서 올렸는데, command 부분이 좀 말썽이라서 실제로 올렸을 때에는 사용하지 않았습니다. 미래에 사용할거고, 언젠가 쓰겠지 하는분은 받으셔도 좋은데 이후 게시글에서는 따로 언급이...없을.. 예정입니다 ㅎ


 

- docker-compose 설치

# docker-compose 설치 - 아래 깃 링크에서 버전 확인하고 {version!!!}대신 넣기
sudo curl -L "https://github.com/docker/compose/releases/download/{version!!!}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 권한설정
sudo chmod +x /usr/local/bin/docker-compose
# Path 에러 방지
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 설치된 docker-compose 버전확인
docker-compose --version

* https://github.com/docker/compose/releases/

 

Releases · docker/compose

Define and run multi-container applications with Docker - docker/compose

github.com

* https://docs.docker.com/compose/install/

 

Install Docker Compose

 

docs.docker.com


이정도면 기본적인 서버 설정은 끝난 것 같고, 이제 다음 게시글에서 docker-compose.yml 파일을 만들어서 container를 올려보도록 하겠습니다.

'Server' 카테고리의 다른 글

서버에 올린 Docker Container 정리  (0) 2021.07.27
Docker run 명령어 정리  (1) 2021.07.27

+ Recent posts