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

简介: 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


相关文章
|
19天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
62 2
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:从Docker到Kubernetes的旅程
【10月更文挑战第2天】本文将带你走进云原生的世界,从基础的Docker容器技术开始,逐步深入到Kubernetes集群管理。我们将通过实际代码示例,探索如何利用这些工具构建、部署和管理现代云应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和技能,让你在云原生领域迈出坚实的一步。
89 5
|
13天前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
21天前
|
Cloud Native 持续交付 Docker
Docker容器化技术:从入门到实践
Docker容器化技术:从入门到实践
|
27天前
|
运维 持续交付 虚拟化
docker入门详解!!!
本文介绍了容器技术的发展历程,从物理机到虚拟化再到容器化,重点讲解了Docker的诞生及其优势。Docker通过轻量级的容器技术,实现了资源的高效利用、快速启动、环境一致性、持续交付和部署等优点。文章还详细解析了Docker的架构和工作原理,包括Docker Daemon、REST接口、Docker Client等组件,以及容器与虚拟机的差异。
61 2
|
1月前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
46 3
|
2月前
|
Ubuntu Shell 开发者
Docker入门:轻松开始容器化之旅
【10月更文挑战第17天】Docker 是一种开源的应用容器引擎,它让开发者能够“一次构建、到处运行”。Docker 通过容器化技术将应用程序及其依赖打包在一起,从而确保应用在任何环境中都能一致地运行。本文将为新手用户提供一个全面的Docker入门指南,包括基本概念、优势、安装配置以及如何创建和管理容器。
51 2
|
2月前
|
存储 运维 云计算
探索Docker容器化:从入门到实践
在这个快速发展的云计算时代,Docker容器化技术正在改变应用的开发、部署和管理方式。本文旨在为初学者提供一个关于Docker的全面入门指南,并通过实践案例展示Docker在实际开发中的应用。我们将一起了解Docker的核心概念、基本操作、网络和存储,以及如何构建和部署一个简单的Web应用。无论你是开发者还是运维人员,本文都会帮助你快速掌握Docker的核心技能。
|
2月前
|
安全 网络安全 开发者
Docker学习笔记(一):Docker命令总结
本文介绍了Docker的基本概念、优点以及常用命令。Docker是一个开源的应用容器引擎,它通过容器打包应用程序及其依赖项,实现快速部署和迁移。主要优点包括轻量级、可移植性、易于管理、安全性和开源性。文章还区分了镜像和容器的概念,并提供了构建镜像、查看容器、运行容器、停止和删除容器等常用Docker命令的示例。
143 0
|
2月前
|
Kubernetes Cloud Native Docker
云原生入门:Kubernetes和Docker的协同之旅
【10月更文挑战第4天】在这篇文章中,我们将通过一次虚拟的旅行来探索云原生技术的核心——Kubernetes和Docker。就像乘坐一艘由Docker驱动的小船启航,随着波浪(代码示例)起伏,最终抵达由Kubernetes指挥的宏伟舰队。这不仅是一段技术上的旅程,也是理解现代云架构如何支撑数字世界的冒险。让我们扬帆起航,一探究竟!