[리원아빠] Docker 환경에서 파이썬 GUI 환경 구축하기

2022. 8. 5. 13:17IT Information

반응형

Docker 환경에서 파이썬 GUI 환경 구축하기



2022.07.12 - [IT Information] - [리원아빠] docker 개념 및 설치, 그리고 기본 설정 (저장위치 변경, 고정 IP 부여)

 

[리원아빠] docker 개념 및 설치, 그리고 기본 설정 (저장위치 변경, 고정 IP 부여)

docker 개념 및 설치 그리고 저장소 위치 변경 및 고정 IP 부여하기 이번 포스팅에서는 docker에 대해 알아보고자 한다. docker를 설치하는 방법, 저장위치를 변경하는 방법과 고정IP를 부여하는 방법

liwonfather.tistory.com

위의 포스팅에서 docker의 개념 및 설치 방법 그리고 기본적인 설정 방법에 대해 알아봤다.

 

이번 포스팅에는 docker를 활용해 python 개발환경을 구축해보고

 

더 나아가 GUI 환경을 구축하여 docker 환경에서 크롬을 띄우는 방법에 대해 알아보도록 하자.

 

아래 내용부터는 docker 설치는 되어 있다는 가정하에 진행되므로

 

docker를 설치하지 않았다면 위의 포스팅을 참조하여 docker를 설치하도록 하자.

 

 

docker 환경의 python 개발환경을 구축하기 위해서는 

 

가장 먼저 python docker 이미지를 다운받아야 한다.

 

docker가 설치된 서버에서 원하는 이미지를 검색하거나

 

docker hub 홈페이지에서 직접 검색하면 된다.

 

작성자의 경우 가장 다운로드 수가 많고 official 부분이 OK로 되어 있는 가장 최상위의 이미지를 다운받고자 한다.

 

명령어 : docker search [검색어]     => docker 이미지를 검색하는 명령어

 

URL : https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy

hub.docker.com

 

 

원하는 docker 이미지는 pull 명령어를 통해 다운 받을 수 있다.

 

다운이 완료되면 python이라는 이름의 이미지가 자신의 docker에 추가되었음 확인 가능하다.

 

명령어 : docker pull [docker 이미지]     => docker 이미지를 다운받는 명령어

 

명령어 : docker images     => 자신의 docker에 존재하는 이미지들을 확인하는 명령어

 

 

다운받은 docker 이미지는 container로 만들어야 사용이 가능하다.

 

GUI 환경까지 구성해야 하므로 container를 만들 때 미리 관련된 옵션들을 주어 container를 생성해야 한다.

 

명령어 : docker create -it -e DISPLAY=$DISPLAY -e USER=$USER -v /tmp/.X11-unix:/tmp/.X11-unix -v /root/.Xauthority:/root/.Xauthority --net host --name [컨테이너 이름] [이지미 이름]

 

옵션 설명

  • -e 옵션 : docker에 환경변수 값을 전달하기 위해 사용된다.
  • -v 옵션 : hostOS의 경로를 docker내 지정한 경로로 마운트 한다. 위의 예제에서는 hostOS의 /tmp/.X11-unix를 새로 만들 container의 /tmp/.X11-unix 경로로 마운트한다.
  • --net host 옵션 : container 내부의 프로그램이 HostOS의 네트워크 정보를 통해 수행된다.

다시 정리하자면 GUI 환경을 위해서 DISPLAY, USER 변수를 container로 전달했고 /tmp/.X11-unix, /root/.Xauthority 경로를 container에 마운트했다.

 

그리고 가장 중요한 점인데 네트워크를 host로 설정하여 container에서 수행하더라도 hostOS에서 수행되는것처럼 설정하였다.

 

 

container를 생성했으니 이제 생성한 container를 실행하자.

 

실행후 해당 container에 접속해 python이 정상 작동하는지 확인하자.

 

해당 포스팅일자 기준 python 이미지의 python 버젼은 3.10.6으로 확인된다.

 

docker container를 시작하고 해당 container에 접속하는 명령어는 아래와 같다.

 

명령어 : docker start [container 이름]     => 해당 container을 시작한다.

 

명령어 : docker exec -it [container 이름] /bin/bash     => 해당 container에 접속하여 bash 쉘을 수행한다.

 

 

다운받은 python 이미지는 데비안 계열의 리눅스이다.

 

따라서 yum이 아닌 apt-get을 통해 패키지들을 설치 및 관리한다.

 

apt-get update를 통해 최신화를 진행하고

 

가장 간단하게 테스트해볼 수 있는 gui 패키지인 x11-apps 패키지를 설치하자.

 

설치 후, xclock이라는 명령어를 통해 GUI 환경의 시계창을 띄워보자.

 

오류가 발생했다. 무엇이 문제일까?

 

 

쉽게 설명하면 container에서는 그림을 그리고 싶지만 그릴 수 있는 스케치북이 없어 오류가 발생한 것이다.

 

container에서 GUI를 사용하기 위해서 현재 사용하고 있는 PC를 스케치북으로 제공해주도록 하자.

 

스케치북을 제공하는 역활을 해주는 프로그램으로는 xming, xmanager등이 있는데

 

xmanager 경우 유료이므로 xming을 설치해 container에게 스케치북을 제공해주자.

 

xming은 아래 사이트에서 다운 받을 수 있다.

 

URL : https://xming.softonic.kr/

 

 

자신의 PC에 xming을 설치하고 docker container에서 다시 xclock 명령어를 수행해보자.

 

container에 그림을 그릴 스케치북을 제공했으므로

 

이렇게 시계창이 정상적으로 생성된다.

 

xming은 실행중일 경우 윈도우 작업표시줄에 나타난다.

 

 

생성한 docker container에서 GUI 환경 구성은 완료된 셈이다.

 

이제 우리의 다음 목표인 크롬을 설치해보자.

 

크롬 패키지명은 google-chrome-stable 이고 apt-get을 통해 설치할 수 있다.

 

명령어 : apt-get -y install google-chrome-stabe

 

하지만 작성자는 설치를 시도했지만 오류가 발생했다.

 

작성자처럼 해당 오류가 발생한다면 추가적인 작업을 해줘야한다.

 

오류가 발생하지 않고 정상적으로 설치된 경우에는 아래의 과정은 생략해도 된다.

 

 

오류가 발생했다면 먼저 /etc/apt/sources.list 파일을 수정해야 한다.

 

작성자와 동일한 docker image로 container를 구성했다면

 

vi 명령어도 수행되지 않을텐데 apt-get을 통해 설치를 해야한다.

 

명령어 : apt-get -y install vim

 

 /etc/apt/sources.list 추가할 내용 : deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main

 

 

파일을 수정하고 나면 아래 명령어들을 차례대로 수행하자.

wget https://dl.google.com/linux/linux_signing_key.pub
apt-get -y install gnupg
apt-key add linux_signing_key.pub
apt update
apt-get install -y google-chrome-stable

차례대로 잘 따라왔다면 이제 python container에 크롬이 설치된다.

 

 

2022.03.16 - [Python] - [리원아빠] 파이썬으로 티스토리 공감버튼 (좋아요) 누르기

 

[리원아빠] 파이썬으로 티스토리 공감버튼 (좋아요) 누르기

파이썬으로 티스토리 공감버튼 (좋아요) 자동 눌러주기 티스토리를 운영하다 보면 신경쓰고 싶지 않아도 신경쓰이는게 방문자수와 공감수이다. 양질의 포스팅을 하게 되면 자연스럽게 올라가

liwonfather.tistory.com

import time
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from fake_useragent import UserAgent
from webdriver_manager.chrome import ChromeDriverManager

options = Options()
userAgent =UserAgent().random

#options.add_argument('--headless')             #container용 추가 옵션
options.add_argument('--no-sandbox')           #container용 추가 옵션
options.add_argument('--disable-dev-shm-usage')#container용 추가 옵션
options.add_argument(f'user-agent={userAgent}') #fake_useragent로 옵션값 설정
options.add_argument('--incognito')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
driver.set_window_size(800, 400)
site_url = 'https://liwonfather.tistory.com/m'
driver.get(site_url)

#페이지 스크롤 하여 게시글 더 불러오기 (반복문 횟수를 통해 최대 불러올 게시글 조정 가능)
for i in range(0, 5, 1):
    driver.find_element('tag name', 'body').send_keys(Keys.PAGE_DOWN)   #마우스 스크롤 역활하여 게시글 더 불러오기
    time.sleep(0.3)

html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
link_list = soup.select('.list_post > li > a')  #게시글의 링크 따오기

#새탭을 열어 크롤링한 게시글을 방문
for i in range (len(link_list)):
    site = site_url+link_list[i]['href'].replace('/m','')   #모바일 URL이라 '/m' 이 자동으로 붙어 제거
    driver.execute_script("window.open('');")   #새탭 열기
    driver.switch_to.window(driver.window_handles[1])   #새탭으로 포커스 이동
    driver.get(site)    #위에서 따온 게시글 링크로 이동
    driver.find_element('class name', 'ico_like1').click()  #좋아요 버튼 클릭
    time.sleep(0.3)
    driver.close()#열었던 탭 닫기
    driver.switch_to.window(driver.window_handles[0]) #다시 탭이 하나밖에 남지 않았으므로 0번 순의 탭으로 포커스 이동

driver.quit()   #모든 탭 종료

크롬이 잘 수행되는지 이전에 포스팅했던 python 코드를 수행해보자.

 

윈도우 GUI환경이 아니고 docker GUI 환경이다 보니 아래 옵션을 추가하고

 

창크기를 최대화하는 옵션을 주석 처리하고 창 사이즈를 지정했다.

 

더불어 위의 python 코드를 설치하기 위해서는 pip로 아래의 모듈을 설치해야 한다.

options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

#driver.maximize_window()    #크롬창 최대화
driver.set_window_size(800, 400)

pip install bs4
pip install selenium
pip install fake_useragent
pip install webdriver_manager

 

 

해당 소스를 실행하면 사용자의 PC화면 크롬창이 생성된다.

 

다만 실제 웹페이지의 내용은 보이지가 않는데 이부분은 해결해야할 과제이다.

 

화면은 문제있어 보여도 정상적으로 좋아요 버튼은 클릭되었으니 오늘은 이정도에서 마무리 하고자 한다.

 

추가적으로 아래 옵션을 활성화하면 크롬창 자체도 생성되지 않고 내부적으로만 소스코드가 수행된다.

 

물론 크롬창이 생성되지 않아도 좋아요 버튼은 잘 클릭된다.

 

크롬창 안띄우는 옵션 : options.add_argument('--headless')

 

그럼 끝.

 

 


추가적인 GUI 환경 테스트를 위한 아주 간단한 소스 코드를 첨부한다.

 

python GUI 프로그램에서 가장 많이 사용되는 tkinter를 활용한 예제이다.

from tkinter import *

w = Tk()
l1 = Label(w, text='height').grid(row=0)
l2 = Label(w, text='width').grid(row=1)
e1 = Entry(w).grid(row=0,column=1)
e2 = Entry(w).grid(row=1,column=1)

w.mainloop()

 

반응형