Vă voi lăsa să intru într-un secret DevOps aici: lucrul pe care toți oamenii DevOpsy adoră să-l facă este să construiască un sistem foarte elegant și complex, apoi să găsească o modalitate de a face față acestuia ca un shell obișnuit. Sau conectați-vă la acesta cu SSH și apoi tratați-l ca un shell obișnuit.

Docker nu este diferit! Rulați un computer în interiorul altui computer. Poate că acel computer este o instanță EC2 sau un laptop. Puteți chiar să vă înnebuniți și să rulați o mașină virtuală care rulează apoi Docker.

De cele mai multe ori, când folosesc Docker, îl folosesc pentru a împacheta și distribui o aplicație. Uneori îl folosesc pentru ceva mai cool, cum ar fi un proiect de calcul distribuit. Dar de multe ori arunc un fișier Docker într-o repo GitHub, astfel încât să nu trebuiască să instalez CLI-uri pe care doar știu că vor intra în conflict pe laptopul meu.

Pe scurt, puteți spune lui Docker să execute comanda bash, care te aruncă într-o cochilie:

docker run -it name-of-image bash
# docker run -it continuumio/miniconda3:latest bash
# docker run -it node:latest bash

Dar continuați să citiți pentru mai multe. 😉

Încearcă

Google Docker susține limbajul de programare preferat. Pentru mine acesta este Python și, în special, îmi place conda. Apoi executați câteva comenzi pentru a vă asigura că sunteți de fapt în acel shell.

# From Host
echo $(pwd)
# Drop into docker shell
docker run -it continuumio/miniconda3:latest bash
# Now you are in the docker shell!
echo $(pwd)
echo $USER

Tare nu? Acest lucru este perfect pentru depanarea unui container care ar trebui să funcționeze corect. Este, de asemenea, minunat pentru cel mai obișnuit caz de utilizare „Nu vreau să instalez acest lucru pe computerul meu”.

Depanați o construcție Docker cu Docker Run

Tratarea imaginii Docker ca pe un shell obișnuit va fi utilă atunci când încercați să depanați versiunile Docker.

Să presupunem că aveți un fișier Docker pentru o imagine pe care încercați să o construiți. În mod normal, ceea ce se întâmplă este că atunci când alergi docker build -t my-image . (-t este pentru etichetă) Docker va rula prin fiecare dintre pașii RUN și se va opri când ajunge la o comandă care nu iese corect.

Într-un shell UNIX, codul de ieșire 0 înseamnă că totul este bine cu o comandă. Deci, pentru a ilustra acest punct, am făcut ca fișierul nostru Dockerfile să aibă o comandă RUN care iese cu 1.

FROM continuumio/miniconda3:latest

RUN apt-get update -y; 
    apt-get upgrade -y; 
    apt-get install -y 
    vim-tiny vim-athena build-essential

RUN  conda update conda 
    && conda clean --all --yes

RUN exit 1
docker build -t my-image .

Acest lucru vă va oferi o ieșire care arată ca:

(base) ➜  my-image docker build -t my-image .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM continuumio/miniconda3:latest
 ---> 406f2b43ea59
Step 2/4 : RUN apt-get update -y;     apt-get upgrade -y;     apt-get install -y     vim-tiny vim-athena build-essential
 ---> Using cache
 ---> 726af29a48a0
Step 3/4 : RUN  conda update conda     && conda clean --all --yes
 ---> Using cache
 ---> 19478bb3ce67
Step 4/4 : RUN exit 1
 ---> Running in 7c98aab6b52c
The command '/bin/sh -c exit 1' returned a non-zero code: 1

Puteți confirma că imaginea Docker nu a fost creată rulând docker images și verificarea pentru my-image. Nu va fi acolo pentru că nu a fost construit cu succes.

Acum ce putem face este să comentăm acea comandă deranjantă Dockerfile RUN.

FROM continuumio/miniconda3:latest

RUN apt-get update -y; 
    apt-get upgrade -y; 
    apt-get install -y 
    vim-tiny vim-athena build-essential

RUN  conda update conda 
    && conda clean --all --yes

#RUN exit 1

Atunci ce veți vedea este:

Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM continuumio/miniconda3:latest
 ---> 406f2b43ea59
Step 2/3 : RUN apt-get update -y;     apt-get upgrade -y;     apt-get install -y     vim-tiny vim-athena build-essential
 ---> Using cache
 ---> 726af29a48a0
Step 3/3 : RUN  conda update conda     && conda clean --all --yes
 ---> Using cache
 ---> 19478bb3ce67
Successfully built 19478bb3ce67
Successfully tagged my-image:latest

Acum puteți intra în imaginea Docker și puteți începe să executați comenzi interactiv!

docker run -it my-image bash
# you can also run
# docker run -it my-image:latest bash

De aici, unul câte unul, puteți începe să depanați comenzile RUN pentru a vedea ce a mers prost. Dacă nu sunteți sigur dacă o comandă a ieșit corect sau nu, rulați $?:

# First run docker run -it my-image bash to get to the shell
# Print the string hello
echo "hello"
# hello
echo $?
# 0

# Run a non existant command hello
$(hello)
# bash: hello: command not found
echo $?
# 127

Puteți continua să parcurgeți acești pași, comentând fișierul Docker, coborând într-un shell și descoperind comenzi problematice, până când imaginile dvs. Docker se dezvoltă perfect.

Învelire

Sperăm că v-am arătat că utilizarea unei imagini Docker nu diferă de terminalul de pe computer. Utilizarea imaginilor Docker este un mod minunat de distribuire a aplicațiilor.

Încercați să luați aplicația CLI preferată sau următorul proiect GitHub și, în loc să creați un script de instalare, împachetați-l cu Docker. 😉