도커 bind mounts 사용법에 대한 정리


환경

  • Linux
  • Docker


Bind Mounts

  • 도커에서는 파일을 여러가지 방식으로 저장할 수 있게 지원해준다.
  • 공식문서에는 3가지 방식이 나왔있는데 아래 그림과 같다.
  • 이 글에서는 아래에 있는 Bind mounts 예시들만 정리한다. 사용에 대한 자세한 옵션들은 공식문서에 나와있다.
  • Bind mounts는 호스트 경로에 있는 디렉토리나 파일을 컨테이너에 붙여 직접 접근할 수 있도록 해준다.
  • --mount-v 옵션을 통해 사용할 수 있다.


Bind Mounts 예시

기본 사용 형태

  • 아래는 공식문서에 나와있는 예시
  • --mount 옵션 뒤에 필요한 값들을 넣어주면 된다.
  • 어떤 호스트 파일 혹은 디렉토리를 컨테이너의 어디에 넣을건지 각각 sourcetarget에 값을 주면된다.
  • 아래의 경우 호스트의 "$(pwd)"/target에 있는 디렉토리가 컨테이너에서 /app에 해당하는 디렉토리가 된다. 그렇기에 호스트에서 ls "$(pwd)"/target의 결과와 컨테이너에서 ls /app의 결과가 같다.
  • 호스트의 파일이나 디렉토리를 참조하는거기 때문에 컨테이너에서 변경하면 호스트에서도 동일하게 변경된다.
docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx:latest
  • 일반화
docker run -d \
  -it \
  --name [CONTAINER NAME] \
  --mount type=bind,source="[HOST PATH]",target="[TARGET PATH]" \
  [IMAGE NAME]:[TAG]


예시에 사용할 파일들

  • 호스트 파일
$ ls -al ~/test/test.txt
-rw-rw-r-- 1 twpower twpower 37 Feb 27 20:46 /home/twpower/test/test.txt
$ cat ~/test/test.txt
String
test string
Line in container
  • 호스트 디렉토리
$ ls -al test-docker-bind/
total 16
drwxrwxr-x  2 twpower twpower 4096 Feb 27 21:17 .
drwxr-xr-x 30 twpower twpower 4096 Feb 27 21:17 ..
-rwxrwxr-x  1 twpower twpower   25 Feb 27 21:17 test.sh
-rw-rw-r--  1 twpower twpower   19 Feb 26 22:59 test.txt
$ cat test-docker-bind/*
#!/bin/sh

echo "result"
String
test string
  • 도커 이미지: ubuntu:18.04
$ sudo docker images
REPOSITORY    TAG              IMAGE ID       CREATED         SIZE
ubuntu        18.04            56def654ec22   5 months ago    63.2MB


예시

호스트 파일 -> 컨테이너 파일

  • 하나의 호스트 파일을 컨테이너의 특정 파일로 마운트
  • 파일명을 target에 명시해줘야한다.
  • 파일이 컨테이너에 이미 존재한다면 덮어쓰고 호스트 파일을 마운트한다.
# Mount host file "/home/twpower/test/test.txt" to container directory "/root"

sudo docker run -d -it --name file-to-container --mount type=bind,source="/home/twpower/test/test.txt",target="/root/test.txt" ubuntu:18.04
  • 이름을 컨테이너에서 아래처럼 변경도 가능하다.
# Mount host file "/home/twpower/test/test.txt" to container directory "/root" with renaming

sudo docker run -d -it --name file-to-container --mount type=bind,source="/home/twpower/test/test.txt",target="/root/test-rename.txt" ubuntu:18.04
  • 컨테이너에 없는 디렉토리를 추가적으로 명시하면 해당 디렉토리를 만들어서 파일을 마운트한다.
# Mount host file "/home/twpower/test/test.txt" to container directory "/home/twpower/test/new-directory-in-container"

sudo docker run -d -it --name file-to-container --mount type=bind,source="/home/twpower/test/test.txt",target="/home/twpower/test/new-directory-in-container/test.txt" ubuntu:18.04


호스트 디렉토리 -> 컨테이너 디렉토리

  • sourcetarget에 각각 디렉토리를 명시해 마운트하면 source 하위에 있는 파일들과 디렉토리들이 target 디렉토리에 들어간 형태로 나온다.
# Mount host directory "/home/twpower/test-docker-bind" to container directory "/root"

sudo docker run -d -it --name dir-to-container --mount type=bind,source="/home/twpower/test-docker-bind",target="/root" ubuntu:18.04
$ ls /home/twpower/test-docker-bind
test.sh  test.txt
$ sudo docker exec -it dir-to-container ls /root
test.sh  test.txt
  • 동일한 디렉토리를 특정 디렉토리 하위에 만들고 싶다면 끝에 디렉토리명을 추가해주면 된다.
# Mount host directory "/home/twpower/test-docker-bind" to container directory "/root/test-docker-bind"

sudo docker run -d -it --name dir-to-container --mount type=bind,source="/home/twpower/test-docker-bind",target="/root/test-docker-bind" ubuntu:18.04
$ ls /home/twpower/test-docker-bind
test.sh  test.txt
$ sudo docker exec -it dir-to-container ls /root
test-docker-bind
$ sudo docker exec -it dir-to-container ls /root/test-docker-bind
test.sh  test.txt


참고자료

Post about docker bind mounts usage


Environment and Prerequisite

  • Linux
  • Docker


Bind Mounts

  • Docker supports various ways to store files in container.
  • In official doc, there are three ways like below picture.
  • This post only summarize about Bind mounts in below picture. There are several usages and options in official doc.
  • Bind mounts enables a file or directory on the host machine to be mounted into a container.
  • Use via --mount or -v option.


Bind Mounts Examples

Basic Usage Form

  • Below example is from official doc.
  • Add needed options after --mount.
  • Add host’s file or directory to source and container’s path to target.
  • In below case, host’s "$(pwd)"/target directory becomes container’s /app directory. So result of ls "$(pwd)"/target in host and ls /app in container are same.
  • It is reference of host’s file or directory so change in container would be affect to host.
docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx:latest
  • General form
docker run -d \
  -it \
  --name [CONTAINER NAME] \
  --mount type=bind,source="[HOST PATH]",target="[TARGET PATH]" \
  [IMAGE NAME]:[TAG]


Needed Files For Examples

  • Host file
$ ls -al ~/test/test.txt
-rw-rw-r-- 1 twpower twpower 37 Feb 27 20:46 /home/twpower/test/test.txt
$ cat ~/test/test.txt
String
test string
Line in container
  • Host directory
$ ls -al test-docker-bind/
total 16
drwxrwxr-x  2 twpower twpower 4096 Feb 27 21:17 .
drwxr-xr-x 30 twpower twpower 4096 Feb 27 21:17 ..
-rwxrwxr-x  1 twpower twpower   25 Feb 27 21:17 test.sh
-rw-rw-r--  1 twpower twpower   19 Feb 26 22:59 test.txt
$ cat test-docker-bind/*
#!/bin/sh

echo "result"
String
test string
  • Docker image: ubuntu:18.04
$ sudo docker images
REPOSITORY    TAG              IMAGE ID       CREATED         SIZE
ubuntu        18.04            56def654ec22   5 months ago    63.2MB


Examples

Host file -> Container file

  • Mount single host file to specific container’s file
  • Need to specify file name to target.
  • If file already exists in container, then file will be overwritten.
# Mount host file "/home/twpower/test/test.txt" to container directory "/root"

sudo docker run -d -it --name file-to-container --mount type=bind,source="/home/twpower/test/test.txt",target="/root/test.txt" ubuntu:18.04
  • Name can be changed in container like below.
# Mount host file "/home/twpower/test/test.txt" to container directory "/root" with renaming

sudo docker run -d -it --name file-to-container --mount type=bind,source="/home/twpower/test/test.txt",target="/root/test-rename.txt" ubuntu:18.04
  • If you additionally specify a directory that is not in the container, the directory is created and files are mounted.
# Mount host file "/home/twpower/test/test.txt" to container directory "/home/twpower/test/new-directory-in-container"

sudo docker run -d -it --name file-to-container --mount type=bind,source="/home/twpower/test/test.txt",target="/home/twpower/test/new-directory-in-container/test.txt" ubuntu:18.04


Host directory -> Container directory

  • If you specify directory to each source and target and mount, then it appears files and directories under source directory are shown in target directory.
# Mount host directory "/home/twpower/test-docker-bind" to container directory "/root"

sudo docker run -d -it --name dir-to-container --mount type=bind,source="/home/twpower/test-docker-bind",target="/root" ubuntu:18.04
$ ls /home/twpower/test-docker-bind
test.sh  test.txt
$ sudo docker exec -it dir-to-container ls /root
test.sh  test.txt
  • If you would like to make same directory under specific directory in container, then add directory name in the end.
# Mount host directory "/home/twpower/test-docker-bind" to container directory "/root/test-docker-bind"

sudo docker run -d -it --name dir-to-container --mount type=bind,source="/home/twpower/test-docker-bind",target="/root/test-docker-bind" ubuntu:18.04
$ ls /home/twpower/test-docker-bind
test.sh  test.txt
$ sudo docker exec -it dir-to-container ls /root
test-docker-bind
$ sudo docker exec -it dir-to-container ls /root/test-docker-bind
test.sh  test.txt


Reference

중요한거에 집중하는 마음을 다시 다지기 위해 회고를 작성


배경

작년에 회고를 작성한지 2개월만에 다시 회고를 작성하게 되었다. 이유는 목표한대로 블로그 작성이 되고 있지 않기 때문이다! 바쁘기도 하고 전공에 대한 관심이 떨어진거 회사일 등등 여러가지 일들 때문이기도 하다. 그런데 짧은 글을 작성할때 조차 사소한 부분에 지나치게 신경을 쓰는 모습을 다시 발견해서 반성하고자 작성한다.


무엇이 문제?

사소한 부분에 지나치게 집중

글을 쓰다보면 여전히 내 큰 문제점중에 하나가 있다. 사소한 부분에 지나치게 시간을 많이 쓴다. 글을 쓸때 내용말고 중요한 점은 아래와 같다.

  • 다음에 다시 볼 때 이해할 수 있어야 한다.
  • 남들이 봤을때 이해할 수 있어야 한다.

이 두 가지에 초점을 맞춰서 글을 써야하는데 예전부터 그랬지만 아직까지도 아래와 같은 문제들이 있는거 같다.

  • 맞춤법이나 철자에 지나치게 신경쓴다.
  • 내용보다는 형식이나 레이아웃에 지나치게 신경쓴다.

당연히 글을 쓰는거니 그리고 창피하지 않으려면… 맞춤법이나 철자는 중요하다. 그리고 글의 형식이나 레이아웃도 가독성을 위해 중요하다. 하지만! 정작 내용 작성이 30분이면 위에 사항들을 점검하는데 1시간이 걸리는게 문제다.

예를 들면 언어를 표기할 때 “Python과 python중에서 어떤걸 써야할까?”와 같은 문제를 1시간 넘게 고민한적도 있다. 내용을 볼 때 가볍게 넘어갈 내용인데도 지나치게 신경을 쓴다. 영어에서는 언어는 고유명사이고 대문자로 표기한다고 하지만… 이미 작성된 소문자들도 있어서 “이걸 다 바꿔야하나?”라는 생각을 하기도 했다. 하도 이런거로 고민해서 이제 언어는 URL이나 컨벤션처럼 소문자로 써야하는 경우가 아니면 다 대문자로 쓰려고 한다. 기존에 문서들은 발견할 때 수정하도록 하기로 했다. 기존 문서들이 250개가 넘는데 다 찾아서 하기에는 너무 시간이 많이들고 시간대비 얻을것도 없다.

또 다른 예로 문단간 띄어쓰기나 띄어쓰는 칸을 지나치게 보는 경향이 있다.. 예를 들어서 “<br>“태그를 몇개 써야한다거나 그런? 그리고 “#을 마크다운에 사용할 때 몇개를 사용할까?”와 같은 내용이다.

상단의 내용들도 어찌보면 독자에게 있어서 그리고 규칙이 있으니 지켜야하지만 글 쓰는 시간보다 2배 더 걸리면 문제가 있는거 같다… 이것도 블로거의 성장하는 과정중 하나일까? 이제 내 나름대로의 규칙도 정했으니 시간을 너무 쓰지 않아야겠다.


마무리

글을 쓸때 아래의 내용들을 명심하자.

  • 내용에 집중하자
  • 컴퓨터 언어를 언급할때는 소문자로 명시해야하는게 아니면 대문자를 사용하자
  • 기존에 있는 문서들은 문제를 발견하면 그때 수정하자
  • 내용 > 레이아웃과 형식

Reflect on myself to refocus on important things when writing a blog post


Background

Two months after writing a retrospective last year, I came to write a new retrospective. The reason is that blog posts were not written in what I intended! Of course there are some reasons like busy life, lower interests in major than before, works and etc. However I found myself that when writing a short blog post, I too much focus on little things.


What is problem?

Too much focus on little things

Still there are problems when writing a blog post. Too much focus on little things. Below are important things when writing a blog post except content.

  • It should be understandable when read again in the future.
  • It should be understandable to other readers.

I need to focus on above two things but I’m not. Below problems are still exist to me.

  • Cares too much about spelling and grammar.
  • Cares too much about form and layout.

Of course in writing, in order not to be embarrassed… spelling and grammar is important. Also, layout and form are important for readability. However! the problem is that if the content is written in 30 minutes, it takes an hour to check the above things.

For example, when mentioning language in post, I considered a simple question like “Which one do I have to use Python or python?” in an hour. Too much focus on it even though it is little things. In English, I found that language is a proper noun so it should be written in capital letter… but there are already many words written in lower case in my posts. Do I have to change all in now?… Hmm I’m not sure. After now, I decided to use capital letter except in special case like URL or snake case naming convention. If problems were found in existing documents, fix when problems were found. Don’t try to fix such problems in all documents. There are over 200 posts so it is not worthy to do that.

Another example is that I too much focus on space between paragraph or header. For example, number of using “<br>” tags or “How many #s are needed in this header?”

Above things are rules so it is important. I know. However if it takes twice times than writing a content, there seems to be a problem. Is it just a growing procedure of blogger? Whatever, from now I made my own rule so I don’t like to spend too much time on above problems.


Wrap Up

Keep in mind below things when writing a blog post.

  • Focus on contents
  • Use capital letter when mentioning computer language if it does not have to written in lower case.
  • If problems were found in existing documents, fix when problems were found. Don’t try to fix such problems in all documents
  • Contents are important than layout and format

List slicing examples in Python


Environment and Prerequisite

  • Python(3.X)


What is Python slicing?

  • Slicing or Slice: refers the method and notation of importing objects by specifying a range of sequential objects (such as lists, tuples, strings).
  • Slicing makes new objects. Easily say, copy some portion of objects.


Basic Usage and Form

Basic Form

  • Consider there is sequential objects data structure(example: list, tuple, string) which name is a. Its basic form of slicing is like below.

a[start : end : step]

  • Each start, end, step can have both positive or negative number.
  • start: Start point of slicing.
  • end: End point of slicing. Note that it does not include end point!
  • step: Also known as stride, determine moving steps of import and direction. It is an option. Check below examples for your understanding.


Position of Indices Values

  • Like explained above, it can have Positive or Negative number.
  • Positive Number: It starts number 0 from the front of data structure and goes forward by increasing the index.
  • Negative Number: It starts number -1 from back of data structure and goes backward by decreasing the index.
  • Below shows example of indices values in list ['a', 'b', 'c', 'd', 'e'].
a = ['a', 'b', 'c', 'd', 'e']

// Index References
-------------------------------
|  a  |  b  |  c  |  d  |  e  |
-------------------------------
|  0  |  1  |  2  |  3  |  4  |          // In case of positive number
-------------------------------
| -5  | -4  | -3  | -2  | -1  |          // In case of negative number
-------------------------------


Example

  • All examples are base on list a = ['a', 'b', 'c', 'd', 'e'].


Import from specific start point to end

  • a[ start : ]

>>> a = ['a', 'b', 'c', 'd', 'e']
>>> a[ 1 :  ]
['b', 'c', 'd', 'e']


>>> a = ['a', 'b', 'c', 'd', 'e']
>>> a[ -3 :  ]
['c', 'd', 'e']


Import from start point to specific end point

  • a[ : end ]

>>> a = ['a', 'b', 'c', 'd', 'e']
>>> a[  : 2 ]
['a', 'b']


>>> a = ['a', 'b', 'c', 'd', 'e']
>>> a[  : -1 ]
['a', 'b', 'c', 'd']


Import from a specific point to a specific point

  • a[ start : end ]

>>> a = ['a', 'b', 'c', 'd', 'e']
>>> a[ 2 : 4 ]
['c', 'd']


>>> a = ['a', 'b', 'c', 'd', 'e']
>>> a[ -4 : -2 ]
['b', 'c']


>>> a = ['a', 'b', 'c', 'd', 'e']
# get values of index from 1 to 3 in reverse
>>> a[ 3 : 0 : -1]
['d', 'c', 'b']


Example of step

  • a[ start : end : step ]
  • If step is positive: Get value per size of ‘step’ while moving to right.
  • If step is negative: Get value per size of ‘step’ while moving to left.

>>> a = ['a', 'b', 'c', 'd', 'e']
# get value while moving 2 steps.
>>> a[ : : 2 ]
['a', 'c', 'e']


>>> a = ['a', 'b', 'c', 'd', 'e']
# get value while moving 3 steps.
>>> a[ -5 : : 3 ]
['a', 'd']


>>> a = ['a', 'b', 'c', 'd', 'e']
# get all in reverse.
>>> a[ : : -1 ]
['e', 'd', 'c', 'b', 'a']


>>> a = ['a', 'b', 'c', 'd', 'e']
>>> a[ 3 : : -1 ]
['d', 'c', 'b', 'a']


Reference