ã³ã³ããåã¯ããšã³ãžãã¢ãã¢ããªã±ãŒã·ã§ã³ã®ã©ã³ã¿ã€ã ç°å¢ããã詳现ã«å¶åŸ¡ã§ããããã«ããããšã§ã ã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªã㣠ãå€§å¹ ã«åäžãããã®ã«åœ¹ç«ã¡ãŸããããããããããã®ã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£äœå¶ãç¶æããããã«ã¯ãæ°ããè匱æ§ãæ¥ã çºèŠãããèšèªããã¬ãŒã ã¯ãŒã¯ã宿çã«ãªãªãŒã¹ããããããããªãã®æéæè³ãå¿ èŠã§ããÂ
ãã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ ã€ã¡ãŒãžã®æŠå¿µã¯ãäžè¬çãªã³ã³ãã ã€ã¡ãŒãžã«å«ãŸãããœãããŠã§ã¢ã®ã»ãšãã©ãæé€ããããšã§ãã¢ããªã±ãŒã·ã§ã³ãå®å šã«ä¿ã€ããã«å¿ èŠãªæéãå€§å¹ ã«ççž®ããããšãçŽæããŸãããŸãããã®ã¢ãããŒãã«ãããããŒã ãè匱æ§ã®ä¿®åŸ©ã«è²»ããæéãççž®ããã䜿çšããŠãããœãããŠã§ã¢ã®ã¿ã«éäžã§ããããã«ãªããŸããÂ
ãã®èšäºã§ã¯ã ç»åã忣ããçç±ã説æãããã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ç»åã®äœæãå®çšçã«ããããŒã«ã«ã€ããŠèª¬æãããã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ç»åããã®å¯èœæ§ãçºæ®ãããã©ããã«ã€ããŠèª¬æããŸãã
ãã£ã¹ããªãã¥ãŒã·ã§ã³ãšã¯äœã§ãã?
Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã¯ãLinuxã«ãŒãã«ãäžå¿ã«æ§ç¯ãããå®å šãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ãããããã±ãŒãžç®¡çã·ã¹ãã ãGNUããŒã«ãšã©ã€ãã©ãªã远å ã®ãœãããŠã§ã¢ãããã³å€ãã®å Žåãã°ã©ãã£ã«ã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã§æ§æãããŠããŸãã
äžè¬çãªLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ã¯ãDebianãUbuntuãArch LinuxãFedoraãRed Hat Enterprise LinuxãCentOSãããã³Alpine Linux(ã³ã³ããã®äžçã§ã¯ããäžè¬ç)ãå«ãŸããŸãã ãããã®Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã¯ãã»ãšãã©ã®Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ãšåæ§ã«ãã»ãã¥ãªãã£ãçå£ã«æ±ã£ãŠãããããŒã ã¯æ¢ç¥ã®è匱æ§ã«å¯Ÿããããããšã¢ããããŒããé »ç¹ã«ãªãªãŒã¹ããããã«ç±å¿ã«åãçµãã§ããŸãã ãã¹ãŠã®Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ãçŽé¢ããªããã°ãªããªãéèŠãªèª²é¡ã«ã¯ããŠãŒã¶ããªãã£ãšã»ãã¥ãªãã£ã®ãžã¬ã³ããå«ãŸããŸããÂ
Linuxã«ãŒãã«èªäœã¯ããŸã䜿ãåæãæªããããå€ãã®ãŠãŒãã£ãªãã£ã³ãã³ãããã£ã¹ããªãã¥ãŒã·ã§ã³ã«å«ãŸããŠãããããŸããŸãªãŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ããŠããŸãã 远å ã®ããã±ãŒãžãã€ã³ã¹ããŒã«ããããšãªããé©åãªãŠãŒãã£ãªãã£ããã£ã¹ããªãã¥ãŒã·ã§ã³ã«å«ããããšã§ããã£ã¹ããªãã¥ãŒã·ã§ã³ã®äœ¿ãããããå€§å¹ ã«åäžããŸãã ãã ãããã®ãŠãŒã¶ããªãã£ã®åäžã®æ¬ ç¹ã¯ãææ°ã®ç¶æ ã«ä¿ã€ããã®æ»æå¯Ÿè±¡é åãå¢ããããšã§ããÂ
Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã¯ãããã2ã€ã®èŠçŽ ã®ãã©ã³ã¹ããšãå¿ èŠãããããã£ã¹ããªãã¥ãŒã·ã§ã³ãç°ãªãã°ããã®ããã®ã¢ãããŒããç°ãªããŸãã èŠããŠããã¹ãéèŠãªåŽé¢ã¯ããŠãŒã¶ããªãã£ãéèŠãããã£ã¹ããªãã¥ãŒã·ã§ã³ã¯ããŠãŒã¶ããªãã£ãéèŠããªããã£ã¹ããªãã¥ãŒã·ã§ã³ããããå®å šæ§ãäœããããã§ã¯ãªããšããããšã§ãã ã€ãŸããããå€ãã®ãŠãŒãã£ãªãã£ããã±ãŒãžãåãããã£ã¹ããªãã¥ãŒã·ã§ã³ã¯ããããå®å šã«ä¿ã€ããã«ãŠãŒã¶ãŒããããå€ãã®åªåãå¿ èŠãšãããšããããšã§ãã
ãã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ç»åãšã¯äœã§ãã?
ãã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ ã€ã¡ãŒãžã¯ããã¹ã Linux ã«ãŒãã«ãå ±æããã¢ããªã±ãŒã·ã§ã³ã®æå°ãªã¹ããå«ãã³ã³ãã ã€ã¡ãŒãžã§ãããã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ ã³ã³ãã ã€ã¡ãŒãžã次ã®ç¹åŸŽããããŸãã
- ããã±ãŒãžãããŒãžã£ãŒãå«ããªã
- ã·ã§ã«ãå«ããªã
- Web ã¯ã©ã€ã¢ã³ã (curl ã wget ãªã©) ã¯å«ããªãã§ãã ãã
æªçšããã³ã³ããŒãã³ããå°ãªãããããã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ã€ã¡ãŒãžã¯ãã³ã³ããã䟵害ãããå Žåã«æ»æè ãå®è¡ã§ããæäœãå¶éããŸããããã«ãããLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã«äŒŽããŠãŒãã£ãªãã£ãšã»ãã¥ãªãã£ã®ãžã¬ã³ãã«èŠããã§ããéçºè ã«ãšã£ãŠãå®çšçãªä»£æ¿ææ®µã«ãªããŸãã
æå°éã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ã³ã³ãããæ§ç¯ããããã®ããŒã«
ã€ã¡ãŒãžã®åæ£èŠå ã詳ãã説æãããšããã§ãéçºè ãã»ãã¥ãªãã£ç®æšãéæããæ»æå¯Ÿè±¡é åãæå°éã«æããã€ã¡ãŒãžãå®éã«äœæããæ¹æ³ãèŠãŠã¿ãŸããããDocker ããŒã«ããã¯ã¹ã® 2 ã€ã®äž»èŠãªããŒã«ã§ãããã«ãã¹ããŒãž ãã«ããš BuildKit ã䜿çšãããšãæçµçãªã€ã¡ãŒãžã«äœãå ¥ããããæ£ç¢ºã«å¶åŸ¡ã§ããŸãã
ãã«ãã¹ããŒãžãã«ã
ãã«ãã¹ããŒãž ãã«ãã䜿çšãããšãéçºè ã¯ãã«ãæã®äŸåé¢ä¿ãã©ã³ã¿ã€ã ã®äŸåé¢ä¿ããåé¢ã§ããŸãã éçºè ã¯ãå¿ èŠãªãã¹ãŠã®ã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ããããã«æ©èœã®ãã«ãã€ã¡ãŒãžããéå§ããå¿ èŠãªãã«ãã¹ããããå®è¡ããŠããããããã®ã¹ãããã®çµæã®ã¿ããã¹ã¯ã©ããããšåŒã°ããããæå°éã®ããŸãã¯ç©ºã®ã€ã¡ãŒãžã«ã³ããŒã§ããããã«ãªããŸããã ãã®ã¢ãããŒãã§ã¯ãäŸåé¢ä¿ãã¯ãªãŒã³ã¢ããããå¿ èŠããªããããã«ããã«ã ã¹ããŒãžããã£ãã·ã¥å¯èœã§ããããããã«ãæéãå€§å¹ ã«ççž®ã§ããŸããÂ
次ã®äŸã¯ããã«ãã¹ããŒãžãã«ããå©çšããGoããã°ã©ã ã瀺ããŠããŸãã Golangã©ã³ã¿ã€ã ã¯ãã€ããªã«ã³ã³ãã€ã«ãããããããã€ããªèšŒææžãšã«ãŒãèšŒææžã®ã¿ã空çœã®ã¹ã¬ãŒãã€ã¡ãŒãžã«ã³ããŒããå¿ èŠããããŸãã
FROM golang:1.21.5-alpine as build
WORKDIR /
COPY go.* .
RUN go mod download
COPY . .
RUN go build -o my-app
FROM scratch
COPY --from=build
/etc/ssl/certs/ca-certificates.crt
/etc/ssl/certs/ca-certificates.crt
COPY --from=build /my-app /usr/local/bin/my-app
ENTRYPOINT ["/usr/local/bin/my-app"]
BuildKit
ãã«ãKã«ãã£ãŠ docker build çŸåšäœ¿çšãããŠãããšã³ãžã³ ã§ãã ã¯ ãæ¡åŒµå¯èœã§ãã©ã°å¯èœãªã¢ãŒããã¯ãã£ã®ãããã§ãéçºè
ãæå°éã®ã€ã¡ãŒãžãäœæããã®ã«åœ¹ç«ã¡ãŸãã代æ¿ããã³ããšã³ã (ããã©ã«ãã¯äœ¿ãæ
£ãã Dockerfile) ãæå®ããŠããã£ã¹ããªãã¥ãŒã·ã§ã³ ã€ã¡ãŒãžã®äœæã®è€éããæœè±¡åããŠé ãæ©èœãæäŸããŸãã ãããã®ããã³ããšã³ãã¯ããã«ãã®ããåçåããã宣èšçãªå
¥åãåãå
¥ããããšãã§ããã¢ããªã±ãŒã·ã§ã³ã®å®è¡ã«å¿
èŠãªãœãããŠã§ã¢ã®ã¿ãå«ãã€ã¡ãŒãžãçæã§ããŸããÂ
次ã®äŸã¯ã Julian Goede ã«ãã mopy ãšãã Python ã¢ããªã±ãŒã·ã§ã³ãäœæããããã®ããã³ããšã³ãã®å ¥åã瀺ããŠããŸãã
#syntax=cmdjulian/mopy
apiVersion: v1
python: 3.9.2
build-deps:
- libopenblas-dev
- gfortran
- build-essential
envs:
MYENV: envVar1
pip:
- numpy==1.22
- slycot
- ./my_local_pip/
- ./requirements.txt
labels:
foo: bar
fizz: ${mopy.sbom}
project: my-python-app/
ããã§ãããªãã®ã€ã¡ãŒãžã¯æ¬åœã«ãã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ã§ãã?
ãã«ãã¹ããŒãžãã«ãã BuildKit ãªã©ã®ã³ã³ããã€ã¡ãŒãžãäœæããããã®æ°ããããŒã«ã®ãããã§ãå¿ èŠãªãœãããŠã§ã¢ãšãã®ã©ã³ã¿ã€ã äŸåé¢ä¿ã®ã¿ãå«ãã€ã¡ãŒãžãäœæããããšãããå®çšçã«ãªããŸãããÂ
ãããããã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ã謳ãå€ãã®ã€ã¡ãŒãžã«ã¯ãã·ã§ã«(éåžžã¯Bash)ãBusyBoxãå«ãŸããŠãããLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ãè¡ã wget å€ãã®ã³ãã³ããæäŸããã³ã³ãããLiving off the land(LOTL)æ»æã«å¯ŸããŠè匱ãªãŸãŸã«ããå¯èœæ§ããããŸãã ãã®ããšãããããªããã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ã«ããããšããŠããã€ã¡ãŒãžã«ãLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã®éèŠãªéšåãå«ãŸããŠããã®ãããšããçåãæ¹§ããŠããŸãã ãã®çãã¯ãéåžžãã³ã³ãããŒã®åæåã«é¢ä¿ããŸããÂ
éçºè ã¯ãå€ãã®å ŽåããŠãŒã¶ãŒã®ããŒãºã«åãããŠã¢ããªã±ãŒã·ã§ã³ãæ§æã§ããããã«ããå¿ èŠããããŸãã ã»ãšãã©ã®å Žåããããã®æ§æã¯ãã«ãæã«ããããªããããå®è¡æã«æ§æããå¿ èŠããããŸãã å€ãã®å Žåããããã®æ§æã¯ã·ã§ã«åæåã¹ã¯ãªããã䜿çšããŠé©çšãããã·ã§ã«åæåã¹ã¯ãªãã㯠sedãgrepãcp ãªã©ã®äžè¬ç㪠Linux ãŠãŒãã£ãªãã£ã«äŸåããŸãã ãã®å Žåãã·ã§ã«ãšãŠãŒãã£ãªãã£ã¯ãã³ã³ãããŒã®æå¹æéã®æåã®æ°ç§éã ãå¿ èŠã§ãã 幞ããªããšã«ãã»ãšãã©ã®ã³ã³ãã㌠ãªãŒã±ã¹ãã¬ãŒã¿ãŒããå ¥æã§ããããŒã« (init ã³ã³ãããŒ) ã䜿çšããŠåæåã§ããããã«ããªãããçã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ ã€ã¡ãŒãžãäœæããæ¹æ³ããããŸãã
ã³ã³ãããŒã®åæå
Kubernetesã§ã¯ã initã³ã³ãã ã¯èµ·åããã³ã³ããã§ããããã©ã€ããªã³ã³ãããèµ·åããåã«æ£åžžã«å®äºããå¿ èŠããããŸãã éãã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ã³ã³ãããããã©ã€ããªã³ã³ãããšããªã¥ãŒã ãå ±æããinitã³ã³ãããšããŠäœ¿çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ãèµ·åããåã«ã©ã³ã¿ã€ã ç°å¢ãšã¢ããªã±ãŒã·ã§ã³ãæ§æã§ããŸããÂ
ãã® init ã³ã³ãããŒã®æå¹æéã¯çã (å€ãã®å Žåããããæ°ç§)ãéåžžã¯ã€ã³ã¿ãŒãããã«å ¬éããå¿ èŠã¯ãããŸããã ãã«ãã¹ããŒãžãã«ãã§éçºè ããã«ãæã®äŸåé¢ä¿ãã©ã³ã¿ã€ã ã®äŸåé¢ä¿ããåé¢ã§ããã®ãšåãããã«ãinit ã³ã³ããã䜿çšãããšãéçºè ã¯åæåã®äŸåé¢ä¿ãå®è¡ã®äŸåé¢ä¿ããåé¢ã§ããŸããÂ
init ã³ã³ããã®æŠå¿µã¯ããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã䜿çšããŠããå Žåã«éŠŽæã¿ããããæ°ããããŒãžã§ã³ã®ã¢ããªã±ãŒã·ã§ã³ãèµ·åããåã«ã¹ããŒãã®ç§»è¡ãå®è¡ããããã« init ã³ã³ããããã䜿çšãããŸãã
Kubernetes ã®äŸ
ããã§ã¯ãinit ã³ã³ããã®äœ¿çšäŸã 2 ã€ç޹ä»ããŸãã ãŸããKubernetesã䜿çšããŸãã
apiVersion: v1
kind: Pod
metadata:
name: kubecon-postgress-pod
labels:
app.kubernetes.io/name: KubeConPostgress
spec:
containers:
- name: postgress
image: laurentgoderre689/postgres-distroless
securityContext:
runAsUser: 70
runAsGroup: 70
volumeMounts:
- name: db
mountPath: /var/lib/postgresql/data/
initContainers:
- name: init-postgress
image: postgres:alpine3.18
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: kubecon-postgress-admin-pwd
key: password
command: ['docker-ensure-initdb.sh']
volumeMounts:
- name: db
mountPath: /var/lib/postgresql/data/
volumes:
- name: db
emptyDir: {}
- - -
> kubectl apply -f pod.yml && kubectl get pods
pod/kubecon-postgress-pod created
NAME READY STATUS RESTARTS AGE
kubecon-postgress-pod 0/1 Init:0/1 0 0s
> kubectl get pods
NAME READY STATUS RESTARTS AGE
kubecon-postgress-pod 1/1 Running 0 10s
Docker Compose ã®äŸ
init ã³ã³ãããŒã®æŠå¿µã¯ããµãŒãã¹ã®äŸåé¢ä¿ãšæ¡ä»¶ã䜿çšããŠããŒã«ã«éçºãè¡ãããã« Docker Compose ã§ãšãã¥ã¬ãŒãããããšãã§ããŸãã
services:
db:
image: laurentgoderre689/postgres-distroless
user: postgres
volumes:
- pgdata:/var/lib/postgresql/data/
depends_on:
db-init:
condition: service_completed_successfully
db-init:
image: postgres:alpine3.18
environment:
POSTGRES_PASSWORD: example
volumes:
- pgdata:/var/lib/postgresql/data/
user: postgres
command: docker-ensure-initdb.sh
volumes:
pgdata:
- - -
> docker-compose up
[+] Running 4/0
â Network compose_default Created
â Volume "compose_pgdata" Created
â Container compose-db-init-1 Created
â Container compose-db-1 Created
Attaching to db-1, db-init-1
db-init-1 | The files belonging to this database system will be owned by user "postgres".
db-init-1 | This user must also own the server process.
db-init-1 |
db-init-1 | The database cluster will be initialized with locale "en_US.utf8".
db-init-1 | The default database encoding has accordingly been set to "UTF8".
db-init-1 | The default text search configuration will be set to "english".
db-init-1 | [...]
db-init-1 exited with code 0
db-1 | 2024-02-23 14:59:33.191 UTC [1] LOG: starting PostgreSQL 16.1 on aarch64-unknown-linux-musl, compiled by gcc (Alpine 12.2.1_git20220924-r10) 12.2.1 20220924, 64-bit
db-1 | 2024-02-23 14:59:33.191 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
db-1 | 2024-02-23 14:59:33.191 UTC [1] LOG: listening on IPv6 address "::", port 5432
db-1 | 2024-02-23 14:59:33.194 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db-1 | 2024-02-23 14:59:33.196 UTC [9] LOG: database system was shut down at 2024-02-23 14:59:32 UTC
db-1 | 2024-02-23 14:59:33.198 UTC [1] LOG: database system is ready to accept connections
åã®äŸã§ç€ºããããã«ãinit ã³ã³ãããŒãã³ã³ãããŒãšäžç·ã«äœ¿çšãããšãæ±çšãœãããŠã§ã¢ãäžèŠã«ãªããçã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ ã€ã¡ãŒãžãäœæã§ããŸããÂ
çµè«
ãã®èšäºã§ã¯ãDocker ãã«ã ããŒã«ã䜿çšããŠããã«ãæã®äŸåé¢ä¿ãšå®è¡æã®äŸåé¢ä¿ãåé¢ããŠãã£ã¹ããªãã¥ãŒã·ã§ã³ã¬ã¹ ã€ã¡ãŒãžãäœæããæ¹æ³ã«ã€ããŠèª¬æããŸãããããšãã°ãinit ã³ã³ããã䜿çšãããšãéçºè ã¯ã©ã³ã¿ã€ã ç°å¢ã®èšå®ã«å¿ èŠãªããžãã¯ãç°å¢èªäœããåé¢ããããå®å šãªã³ã³ãããæäŸã§ããŸãããŸãããã®ã¢ãããŒãã¯ãããŒã ã䜿çšãããœãããŠã§ã¢ã«åŽåãéäžãããã»ãã¥ãªãã£ãšãŠãŒã¶ããªãã£ã®ããè¯ããã©ã³ã¹ãèŠã€ããã®ã«ã圹ç«ã¡ãŸãã
ããã«è©³ãã
- Docker Newsletter ã賌èªããŠãã ããã
- Docker ãã¹ã¯ãããã®ææ°ãªãªãŒã¹ãå ¥æããŸãã
- 質åããããŸãã? Docker ã³ãã¥ããã£ããæäŒãããŸãã
- ããã«ãŒã¯åããŠã§ãã? å§ããŸãããã