Skip to content

Commit

Permalink
기본 설명 진행중.
Browse files Browse the repository at this point in the history
  • Loading branch information
seoyhaein committed Apr 30, 2022
1 parent 6c0d86f commit af6e2df
Show file tree
Hide file tree
Showing 4 changed files with 1,805 additions and 1 deletion.
149 changes: 148 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,158 @@ docker 에 비해서 여러가지 장점들이 있다.

### 관련 링크
- [podman 설치](https://podman.io/getting-started/installation#build-and-run-dependencies)
- [podman 설치 및 실행 예시](https://gochronicles.com/podman/)
- [podman bindings](https://podman.io/blogs/2020/08/10/podman-go-bindings.html)
- [podman trouble shooting](https://github.com/containers/podman/blob/main/troubleshooting.md)
- [podman Demo](https://github.com/containers/Demos)
- [podman restapi manual](https://docs.podman.io/en/latest/Reference.html)

### Volume mount & Bind mount
-[참고](https://www.daleseo.com/docker-volumes-bind-mounts/)

### TODO
- 4.x 와 3.x 코드 비교해서 4.x 코드 중심으로 bindins 관련 학습한다. 소스가 업데이트 됨으로 향후 4.x 가 apt install podman 으로 4.x 도 설치 가능하리라 예상.
- 설치된 version 과 바인딩 코드와 버전 체크하는 api 제작 해야할듯.

### podman 기본사용법 (Docker 랑 사용법이 거의 동일 하다.)

```
// podman 이미지 가져오기
podman pull centos
// 이미지 run 시키기(컨테이너 실행시키기)
podman run -it --name cent centos /bin/sh
// container 가 실행중이고 /bin/bash 또는 /bin/sh 등의 bash 등이 실행되어 있다면 docker 와 같이 attach 로 접근할 수 있다.
podman attach cent
// volume mount 시키기
podman run -v /opt:/opt -it --name centPrint01 centos /bin/sh
```

## podman binding api 정리
먼저, specgen.NewSpecGenerator 함수를 통해서 SpecGenerator 정해준다. 이 SpecGenerator 에 저장된 정보를 통해서 컨테이너를 생성해준다.

컨테이너 생성은 containers.CreateWithSpec 함수가 담당한다. 이후에 podman 사용시 명령어와 binding api는 거의 매칭이 되고 Restful Api 이다.

예를 들어서 컨테이너 생성후 컨테이너가 존재할 경우는 podman start (컨테이너 ID or 컨테이너 Name) 은 binding api start 와 동일하다.

### SpecGenerator
### type ContainerStorageConfig struct
- Image string 컨테이너로 사용할 이미지
- Rootfs string rootfs는 루트 파일 시스템을 뜻하며, 리눅스 파일 시스템을 미리 패키지화 해놓은 바이너리.
- Image 와 Rootfs 둘중하나는 설정되어 있어야 한다.(당연한 소리)
- ImageVolumeMode string image volume 을 어떻게 생성할지를 결정한다. optional 하며 설정을 하지 않거나 "anonymous" 로 설정하면 익명으로 설정한다. (create as anonymous volumes).
- 그외 "ignore" (do not create), "tmpfs" (create as tmpfs) 설정값이 존재한다.
- VolumesFrom []string 컨테이너의 volume 의 소스이다. * volume 좀더 파악해서 보완하자.
- Init bool

Init은 리눅스 커널 부팅이 완료된 뒤 실행되는 첫 번째 프로세스다. 또한 동시에 Init은 커널이 직접 실행하는 유일한 프로세스다.

따라서 Init은 부모 프로세스를 가지지 않는 유일한 프로세스인 동시에, Init을 제외한 나머지 모든 프로세스의 조상이 된다.

docker 기준 설명

docker run 수행 시 --init 옵션이 주어지지 않을 경우는 container 내에서 init process 를 별도로 기동하지 않는다. docker run 수행 시 넘겨준 command(/bin/bash)가 그대로 1 번 process 가 된다.
반대로 docker run 수행 시 --init 옵션이 주어질 경우, init process 를 container 구동 후 1 번 process 로 기동하게 된다.

container 내에서 init process 를 1 번으로 구동한다는 것은 중요한 의미가 있다. 이는 child process 를 받아주어 resource 의 누수나 zombie process 의 생성 등을 방지하는 init system 의 역할을 container 내에서 수행한다는 뜻이기 때문이다.

init process 로 사용되는 default binary 는 /bin/docker-init 을 사용한다. (정확하게는 which docker-init 의 결과로 찾아지는 binary 를 사용) docker-init 은 container 외부에서 별도로 기동되거나 하는 process 가 아니다.

container 내에서 첫 번째로 기동되어 마치 Host 에서의 init process 처럼 동작하도록 만들어진 프로그램이라고 생각하면 된다.

- InitPath string 위의 Init 이 true 이면 설정해줘야 하며 Init 바이너리의 위치가 기록된다. If not specified, the default set in the Libpod config will be used.
- Mounts []spec.Mount 컨테이너에 추가할 마운트들??? Image Volumes 과 VolumesFrom volumes 이 충돌할때 대체한다.???

spec.Mount 는 https://github.com/opencontainers/runtime-spec 에 정의 되어 있고 아래 코드는 https://github.com/opencontainers/runtime-spec/tree/main/specs-go 에서의 config.go 에 설정되어 있다.

```
// Mount specifies a mount for a container.
type Mount struct {
// Destination is the absolute path where the mount will be placed in the container.
Destination string `json:"destination"`
// Type specifies the mount kind.
Type string `json:"type,omitempty" platform:"linux,solaris"`
// Source specifies the source path of the mount.
Source string `json:"source,omitempty"`
// Options are fstab style mount options.
Options []string `json:"options,omitempty"`
}
```

- Volumes []*NamedVolume

named volum은 Docker(Linux에서는 /var/lib/docker/volume/)가 관리하는 Host File System의 일부에 Data가 저장된다.

/specgen/volumes.go 에 있음.
```
// NamedVolume holds information about a named volume that will be mounted into
// the container.
type NamedVolume struct {
// Name is the name of the named volume to be mounted. May be empty.
// If empty, a new named volume with a pseudorandomly generated name
// will be mounted at the given destination.
Name string
// Destination to mount the named volume within the container. Must be
// an absolute path. Path will be created if it does not exist.
Dest string
// Options are options that the named volume will be mounted with.
Options []string
}
```
- OverlayVolumes []*OverlayVolume [참고- 예전에 docker 할때 문제가 있어서 자료 조사 했었는데 잊어버림.](https://www.joinc.co.kr/w/man/12/docker/storage)

- // Image volumes bind-mount a container-image mount into the container.
- // Optional.
- ImageVolumes []*ImageVolume `json:"image_volumes,omitempty"`

위에서 Mounts []spec.Mount 가 대신 할 수 있다고 했다.

```
// Devices are devices that will be added to the container.
// Optional.
Devices []spec.LinuxDevice `json:"devices,omitempty"`
// DeviceCGroupRule are device cgroup rules that allow containers
// to use additional types of devices.
DeviceCGroupRule []spec.LinuxDeviceCgroup `json:"device_cgroup_rule,omitempty"`
// IpcNS is the container's IPC namespace.
// Default is private.
// Conflicts with ShmSize if not set to private.
// Mandatory.
IpcNS Namespace `json:"ipcns,omitempty"`
// ShmSize is the size of the tmpfs to mount in at /dev/shm, in bytes.
// Conflicts with ShmSize if IpcNS is not private.
// Optional.
ShmSize *int64 `json:"shm_size,omitempty"`
```
- directory 설정

```
// WorkDir is the container's working directory.
// If unset, the default, /, will be used.
// Optional.
WorkDir string `json:"work_dir,omitempty"`
// Create the working directory if it doesn't exist.
// If unset, it doesn't create it.
// Optional.
CreateWorkingDir bool `json:"create_working_dir,omitempty"`
```

- 나머지는 그냥 이렇게 넣는다.

```
// RootfsPropagation is the rootfs propagation mode for the container.
// If not set, the default of rslave will be used.
// Optional.
RootfsPropagation string `json:"rootfs_propagation,omitempty"`
// Secrets are the secrets that will be added to the container
// Optional.
Secrets []Secret `json:"secrets,omitempty"`
// Volatile specifies whether the container storage can be optimized
// at the cost of not syncing all the dirty files in memory.
Volatile bool `json:"volatile,omitempty"`
```



113 changes: 113 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
module github.com/seoyhaein/podman-document

go 1.18

require github.com/containers/podman/v3 v3.4.7

require (
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
github.com/BurntSushi/toml v0.4.1 // indirect
github.com/Microsoft/go-winio v0.5.0 // indirect
github.com/Microsoft/hcsshim v0.8.22 // indirect
github.com/VividCortex/ewma v1.2.0 // indirect
github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/blang/semver v3.5.1+incompatible // indirect
github.com/cespare/xxhash/v2 v2.1.1 // indirect
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect
github.com/containerd/cgroups v1.0.1 // indirect
github.com/containerd/containerd v1.5.7 // indirect
github.com/containerd/stargz-snapshotter/estargz v0.9.0 // indirect
github.com/containernetworking/cni v0.8.1 // indirect
github.com/containernetworking/plugins v0.9.1 // indirect
github.com/containers/buildah v1.23.1 // indirect
github.com/containers/common v0.44.5 // indirect
github.com/containers/image/v5 v5.17.0 // indirect
github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b // indirect
github.com/containers/ocicrypt v1.1.2 // indirect
github.com/containers/psgo v1.7.2-0.20220414132323-3ae304491648 // indirect
github.com/containers/storage v1.37.2 // indirect
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
github.com/cri-o/ocicni v0.2.1-0.20210621164014-d0acc7862283 // indirect
github.com/cyphar/filepath-securejoin v0.2.3 // indirect
github.com/disiqueira/gotree/v3 v3.0.2 // indirect
github.com/docker/distribution v2.7.1+incompatible // indirect
github.com/docker/docker v20.10.11+incompatible // indirect
github.com/docker/docker-credential-helpers v0.6.4 // indirect
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-metrics v0.0.1 // indirect
github.com/docker/go-units v0.4.0 // indirect
github.com/fsnotify/fsnotify v1.5.1 // indirect
github.com/ghodss/yaml v1.0.0 // indirect
github.com/godbus/dbus/v5 v5.0.6 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/go-intervals v0.0.2 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/gorilla/mux v1.8.0 // indirect
github.com/gorilla/schema v1.2.0 // indirect
github.com/hashicorp/errwrap v1.0.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hpcloud/tail v1.0.0 // indirect
github.com/imdario/mergo v0.3.12 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/jinzhu/copier v0.3.2 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.13.6 // indirect
github.com/klauspost/pgzip v1.2.5 // indirect
github.com/manifoldco/promptui v0.9.0 // indirect
github.com/mattn/go-runewidth v0.0.13 // indirect
github.com/mattn/go-shellwords v1.0.12 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
github.com/miekg/pkcs11 v1.0.3 // indirect
github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible // indirect
github.com/moby/sys/mountinfo v0.4.1 // indirect
github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mtrmac/gpgme v0.1.2 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.0.2-0.20210819154149-5ad6f50d6283 // indirect
github.com/opencontainers/runc v1.0.2 // indirect
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 // indirect
github.com/opencontainers/runtime-tools v0.9.0 // indirect
github.com/opencontainers/selinux v1.9.1 // indirect
github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/client_golang v1.11.1 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.26.0 // indirect
github.com/prometheus/procfs v0.6.0 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
github.com/sirupsen/logrus v1.8.1 // indirect
github.com/spf13/cobra v1.2.1 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980 // indirect
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect
github.com/tchap/go-patricia v2.3.0+incompatible // indirect
github.com/ulikunitz/xz v0.5.10 // indirect
github.com/vbatts/tar-split v0.11.2 // indirect
github.com/vbauerster/mpb/v7 v7.1.5 // indirect
github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852 // indirect
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
go.etcd.io/bbolt v1.3.6 // indirect
go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 // indirect
go.opencensus.io v0.23.0 // indirect
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359 // indirect
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b // indirect
golang.org/x/text v0.3.7 // indirect
google.golang.org/genproto v0.0.0-20211005153810-c76a74d43a8e // indirect
google.golang.org/grpc v1.41.0 // indirect
google.golang.org/protobuf v1.27.1 // indirect
gopkg.in/fsnotify.v1 v1.4.7 // indirect
gopkg.in/square/go-jose.v2 v2.5.1 // indirect
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)
Loading

0 comments on commit af6e2df

Please sign in to comment.