docker学习笔记1,入门到精通

docker运行输出hello world

docker run ubuntu:18.10 /bin/echo "Hello world"


docker: Docker 的二进制执行文件。 

run: 与前面的 docker 组合来运行一个容器。

ubuntu:18.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。

/bin/echo "Hello world": 在启动的容器里执行的命令


运行交互式的容器

root@DESKTOP-TC0HL14:~# docker run -i -t ubuntu:18.10 /bin/bash
root@364d1f5780b3:/# 

-t: 在新容器内指定一个伪终端或终端。

-i: 允许你对容器内的标准输入 (STDIN) 进行交互。

进入docker容器内,并查看系统版本

root@364d1f5780b3:/# cat /proc/version 
Linux version 5.10.16.3-microsoft-standard-WSL2 (oe-user@oe-host) (x86_64-msft-linux-gcc (GCC) 9.3.0, GNU ld (GNU Binutils) 2.34.0.20200220) #1 SMP Fri Apr 2 22:23:49 UTC 2021
root@364d1f5780b3:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@364d1f5780b3:/# 

退出容器

root@364d1f5780b3:/# exit
exit


后台模式

root@DESKTOP-TC0HL14:~# docker run -d ubuntu:18.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
bde6d6823cdb502006f99a30345bc16f59b8d6ab69f7997448df213450bb5b90

查看所有容器

root@DESKTOP-TC0HL14:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
bde6d6823cdb   ubuntu:18.10   "/bin/sh -c 'while t…"   4 seconds ago   Up 3 seconds             objective_euclid

created(已创建)
restarting(重启中)
running 或 Up(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)

宿主主机内使用 docker logs 命令,查看容器内的标准输出:

root@DESKTOP-TC0HL14:~# docker logs bde6d6823cdb

我们使用 docker stop 命令来停止容器:

root@DESKTOP-TC0HL14:~# docker stop bde6d6823cdb
bde6d6823cdb

也可以通过 docker stop dockername

help用法:例如我们要查看 docker pull 指令的具体使用方法:

root@DESKTOP-TC0HL14:~# docker pull --help

拉取镜像

docker pull ubuntu

启动容器
以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:

root@DESKTOP-TC0HL14:~# docker run -it ubuntu:18.10 /bin/bash
root@d21fb258d9e2:/#

查看所有的容器命令如下:

docker ps -a

在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。

root@DESKTOP-TC0HL14:~# docker run -itd --name ubuntu-test ubuntu /bin/bash

root@DESKTOP-TC0HL14:~# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                      PORTS     NAMES
72d289c7ce1f   ubuntu         "/bin/bash"              About a minute ago   Up About a minute                     ubuntu-tes

docker attach:如果从这个容器退出,会导致容器的停止。
docker exec:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止。

下面演示了使用 docker attach 命令。

root@DESKTOP-TC0HL14:~# docker attach 72d289c7ce1f

如果要导出本地某个容器,可以使用 docker export 命令。

root@DESKTOP-TC0HL14:~# docker export 72d289c7ce1f > ubuntu-test.tar

导出容器72d289c7ce1f快照到本地文件 ubuntu-test.tar。

这样将导出容器快照到本地文件。


可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu-test.tar 导入到镜像 test/ubuntu:v1:

root@DESKTOP-TC0HL14:~# cat ubuntu-test.tar |docker import - test/ubuntu:v1
sha256:193b3451ae486368164c57b3140530544d3640ce58979b0d31996a7809ee9c6a

root@DESKTOP-TC0HL14:~# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
test/ubuntu   v1        193b3451ae48   2 minutes ago   72.8MB

此外,也可以通过指定 URL 或者某个目录来导入,例如:

docker import http://example.com/exampleimage.tgz example/imagerepo


删除容器使用 docker rm 命令:

root@DESKTOP-TC0HL14:~# docker rm -f d21fb258d9e2
d21fb258d9e2

下面的命令可以清理掉所有处于终止状态的容器。

root@DESKTOP-TC0HL14:~# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:

接下来让我们尝试使用 docker 构建一个 web 应用程序。我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。

root@DESKTOP-TC0HL14:~# docker pull training/webapp #载入镜像
root@DESKTOP-TC0HL14:~# docker run -d -P training/webapp python app.py

-d:让容器在后台运行。

-P:将容器内部使用的网络端口随机映射到我们使用的主机上。

root@DESKTOP-TC0HL14:~# docker ps -a
CONTAINER ID   IMAGE             COMMAND           CREATED         STATUS         PORTS                                         NAMES
5b4b8cd28b52   training/webapp   "python app.py"   4 seconds ago   Up 3 seconds   0.0.0.0:49153->5000/tcp, :::49153->5000/tcp   elastic_roentgen

这里多了端口信息

PORTS
0.0.0.0:49153->5000/tcp, :::49153->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 49153上。

通过访问 127.0.0.1:49153,可以看到容器信息

我们也可以通过 -p 参数来设置不一样的端口:

root@DESKTOP-TC0HL14:~# docker run -d -p 5000:5000 training/webapp python app.py
271e11221a06ed5284d597748030d7ae3138b4de1d0d625811d20bff2ddd2b02
root@DESKTOP-TC0HL14:~# docker ps -a
CONTAINER ID   IMAGE             COMMAND           CREATED         STATUS         PORTS                                         NAMES
271e11221a06   training/webapp   "python app.py"   3 seconds ago   Up 2 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp     thirsty_easley

我可以使用 docker port 271e11221a06 或 docker port thirsty_easley 来查看容器端口的映射情况。

root@DESKTOP-TC0HL14:~# docker port 271e11221a06
5000/tcp -> 0.0.0.0:5000
5000/tcp -> :::5000

查看 WEB 应用程序日志
docker logs [ID或者名字] 可以查看容器内部的标准输出。

root@DESKTOP-TC0HL14:~# docker logs -f 5b4b8cd28b52
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
172.17.0.1 - - [19/Apr/2022 01:24:32] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [19/Apr/2022 01:24:33] "GET /favicon.ico HTTP/1.1" 404 -

查看WEB应用程序容器的进程
我们还可以使用 docker top 来查看容器内部运行的进程

root@DESKTOP-TC0HL14:~# docker top 5b4b8cd28b52
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                961                 940                 0                   09:21               ?                   00:00:00            python app.py

使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。


docker ps -l 查询最后一次创建的容器:

oot@DESKTOP-TC0HL14:~# docker ps -l
CONTAINER ID   IMAGE             COMMAND           CREATED         STATUS         PORTS                                       NAMES
271e11221a06   training/webapp   "python app.py"   3 minutes ago   Up 3 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   thirsty_easley

我们可以使用 docker rm 命令来删除不需要的容器

root@DESKTOP-TC0HL14:~# docker rm thirsty_easley
Error response from daemon: You cannot remove a running container 271e11221a06ed5284d597748030d7ae3138b4de1d0d625811d20bff2ddd2b02. Stop the container before attempting removal or force remove

删除容器时,容器必须是停止状态,否则会报如上错误

我们可以使用 docker images 来列出本地主机上的镜像。

docker images

获取一个新的镜像

docker pull ubuntu:18.10

我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。

root@DESKTOP-TC0HL14:~# docker search httpd

我们决定使用上图中的 httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。

root@DESKTOP-TC0HL14:~# docker pull httpd

下载完成后,我们就可以使用这个镜像了。

root@DESKTOP-TC0HL14:~# docker run httpd

删除镜像,镜像删除使用 docker rmi 命令,比如我们删除 ubtuntu:15.10 镜像:

root@DESKTOP-TC0HL14:~# docker rmi ubuntu:15.10

创建镜像
1、从已经创建的容器中更新镜像,并且提交这个镜像
2、使用 Dockerfile 指令来创建一个新的镜像

1.1更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器。

root@DESKTOP-TC0HL14:~# docker run -it ubuntu:18.10 /bin/bash 
root@ad835b256fb0:/# apt-get update

在运行的容器内使用 apt-get update 命令进行更新,可能需要先更新一下yaml源

在完成操作之后,输入 exit 命令来退出这个容器。

此时 ID 为 ad835b256fb0的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。

root@DESKTOP-TC0HL14:~# docker commit -m="has update" -a="test" ad835b256fb0 test/ubuntu:v2
sha256:eace63a9fba9c870204d5dda8ded8819dc044fb8176adda9a6303ef0190f0b3f

-m: 提交的描述信息

-a: 指定镜像作者

ad835b256fb0:容器 ID

test/ubuntu:v2: 指定要创建的目标镜像名


使用我们的新镜像 test/ubuntu:v2 来启动一个容器

root@DESKTOP-TC0HL14:~# docker run -it test/ubuntu:v2 /bin/bash 
root@3a264a683e21:/# 


2.1构建镜像
我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

root@DESKTOP-TC0HL14:~# cat Dockerfile
FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd wb
RUN     /bin/echo 'wb:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

第一条FROM,指定使用哪个镜像源

RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。

然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

docker build -t wb/centos:7.7 . #注意后面有个点


我们可以使用新的镜像来创建容器

root@DESKTOP-TC0HL14:~# docker run -it ba1830a427bb /bin/bash
root@DESKTOP-TC0HL14:~# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED             STATUS                       PORTS                                         NAMES
72e65c6f52ce   ba1830a427bb      "/bin/bash"              5 seconds ago       Exited (139) 4 seconds ago


设置镜像标签
我们可以使用 docker tag 命令,为镜像添加一个新的标签。

root@DESKTOP-TC0HL14:~# docker tag eace63a9fba9 test/ubuntu:dev
root@DESKTOP-TC0HL14:~# docker images
REPOSITORY        TAG       IMAGE ID       CREATED             SIZE
test/ubuntu       dev       eace63a9fba9   29 minutes ago      67.3MB


docker tag 镜像ID,这里是 eace63a9fba9 ,用户名称、镜像源名(repository name)和新的标签名(tag)。

docker容器连接

通过docker部署nginx服务
#-p把容器端口随机在物理机随机映射一个端口

root@DESKTOP-TC0HL14:~# docker run --name nginx -p  80 -itd centos
3d29d081bd85b04c9533962ceec6e7c7864c8770915080460f402f5964500048
root@DESKTOP-TC0HL14:~# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS         PORTS                                     NAMES
3d29d081bd85   centos    "/bin/bash"   10 seconds ago   Up 9 seconds   0.0.0.0:49154->80/tcp, :::49154->80/tcp   nginx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术蜜糖罐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值