前言

之前我们已经探讨过了docker的镜像,看了下时间,距离上次介绍容器的镜像已经过去两个月了, 如果你已经忘记了,可以直奔专栏:容器管理

从今天开始,我们要探讨docker 的容器了,docker的容器都是从镜像开始创建的,涉及到的操作有: 创建容器,停止容器,进入容器,删除容器,导入和导出容器等。

文章目录

前言一. 基础命令1. docker create 创建容器2. docker start 可以运行容器3. 使用docker run命令可以直接创建容器并启动4. docker exec 可以进入容器内5. docker rm -f 删除某个容器6. docker export 导出为文件7. docker import

总结

一. 基础命令

1. docker create 创建容器

比如基于nginx的镜像创建一个名字为 mycontainer的容器,这么创建,我们无法用docker ps查看到创建的容器,因为此时容器还没有启动。

[root@mufeng41 ~]# docker create --name mycontainer nginx

Unable to find image 'nginx:latest' locally

latest: Pulling from library/nginx

a2abf6c4d29d: Pull complete

a9edb18cadd1: Pull complete

589b7251471a: Pull complete

186b1aaa4aa6: Pull complete

b4df32aa5a72: Pull complete

a0bcbecc962e: Pull complete

Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31

Status: Downloaded newer image for nginx:latest

934352be273e17f481397faa897da2a6adcaf2c1cc45d3e88d12c6007da39649

当我们用docker ps 查看的时候,发现没有刚刚创建的容器

[root@mufeng41 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

0ae30069fe97 mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql

但我们可以用docker ps -a 查看,只能看到created ,已经创建成功,没有运行。

[root@mufeng41 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

934352be273e nginx "/docker-entrypoint.…" 21 seconds ago Created mycontainer

0ae30069fe97 mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 2 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql

[root@mufeng41 ~]# docker ps -a |grep mycontainer

934352be273e nginx "/docker-entrypoint.…" 3 minutes ago Created mycontainer

[root@mufeng41 ~]#

2. docker start 可以运行容器

[root@mufeng41 ~]# docker start mycontainer

mycontainer

[root@mufeng41 ~]# docker ps |grep nginx

934352be273e nginx "/docker-entrypoint.…" 4 minutes ago Up 6 seconds 80/tcp mycontainer

[root@mufeng41 ~]#

3. 使用docker run命令可以直接创建容器并启动

[root@mufeng41 ~]# docker run -d --name nginx_mufenggrow nginx

d319b233db2a2c623e1309a7b08b0de6ac64c215f08fbd813879854721a3a0c4

[root@mufeng41 ~]# docker ps |grep nginx_mufenggrow

d319b233db2a nginx "/docker-entrypoint.…" 11 seconds ago Up 10 seconds 80/tcp nginx_mufenggrow

[root@mufeng41 ~]#

docker run:用于在Docker中运行容器的命令。-d:该选项表示容器将以后台模式(detached mode)运行,即在后台运行而不附加到终端。–name nginx_mufenggrow:这是为容器指定一个自定义的名称,即"nginx_mufenggrow"。nginx:这是要使用的Nginx镜像的名称。Docker会从镜像仓库中拉取该镜像并在该容器上运行。

4. docker exec 可以进入容器内

[root@mufeng41 ~]# docker exec -it nginx_mufenggrow /bin/bash

root@d319b233db2a:/# ls

bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var

boot docker-entrypoint.d etc lib media opt root sbin sys usr

root@d319b233db2a:/#

-i : 为docker打开标准输入 -t: 为docker分配一个伪中端

5. docker rm -f 删除某个容器

[root@mufeng41 ~]# docker rm -f nginx_mufenggrow

nginx_mufenggrow

[root@mufeng41 ~]# docker ps |grep nginx_mufenggrow

[root@mufeng41 ~]#

如果容器还在运行,无法删除,需要加-f参数,也可以先停止在用docker rm

停止:docker stop 容器名

6. docker export 导出为文件

docker export命令用于将容器导出为一个文件,该文件包含容器的文件系统内容和元数据,但不包含容器的运行状态。

语法:

docker export [OPTIONS] CONTAINER_ID/CONTAINER_NAME

其中:

OPTIONS:可选参数,用于指定导出时的选项。CONTAINER_ID/CONTAINER_NAME:要导出的容器的ID或名称。

一些常用的选项包括:

-o, --output:指定导出的文件路径和名称。 –change:应用 Dockerfile 中的指令,用于定制导出的容器。

案例: 将一个名字为MySQL的容器使用docker export导出 为 mysql_mufenggrow.tar

[root@mufeng41 ~]# docker export -o mysql_mufenggrow.tar mysql

[root@mufeng41 ~]# ls

anaconda-ks.cfg initial-setup-ks.cfg mysql_mufenggrow.tar 公共 模板 视频 图片 文档 下载 音乐 桌面

[root@mufeng41 ~]#

7. docker import

docker import命令用于将文件系统存储为Docker镜像。它可以将先前使用docker export导出的容器文件或其他文件导入为新的Docker镜像。

语法:

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

其中:

OPTIONS:可选参数,用于指定导入时的选项。file|URL|-:要导入的文件路径、URL或使用-表示从标准输入流导入。REPOSITORY[:TAG]:导入的新Docker镜像的仓库名称和标签。

一些常用的选项包括:

–change:应用 Dockerfile 中的指令,用于定制导入的镜像。

示范案例:

创建个新环境

·`[root@mufeng41 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

[root@mufeng41 ~]#

可以看到什么都没有。

接下来我们把 mysql_mufenggrow.tar 重新导入镜像并开机

root@mufeng41 ~]# docker import mysql_mufenggrow.tar mysql_mufenggrow

sha256:06bfcd68bd0e74599d5e4cedf077a760150453b91bad57261308ead6bcf09703

[root@mufeng41 ~]# docker images;

REPOSITORY TAG IMAGE ID CREATED SIZE

mysql_mufenggrow latest 06bfcd68bd0e 6 seconds ago 442MB

可以看到生成了一个mysql_mufenggrow的镜像,接下来我们用这个镜像生成容器

[root@mufeng41 ~]# docker run -it --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql_mufenggrow /bin/bash

7267c237c5accbe424106648bdcfd614743c3f008eef46dc0e7e43a922dcdb49

[root@mufeng41 ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

7267c237c5ac mysql_mufenggrow "/bin/bash" 2 seconds ago Up 1 second 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp mysql

使用场景:

主要用来制作基础镜像,比如从一个ubuntu镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export保存为一个基础镜像。然后把这个镜像分发给其他人使用,作为基础的开发环境。

需要注意的是:

会丢弃历史记录和元数据启动export与import命令导出导入的镜像必须加/bin/bash或者其他/bin/sh,否则会报错docker export导出的镜像是不带历史记录的,如果原本的镜像有3层,export之后只会有1层,这一层为从镜像运行到export之间对文件系统的修改可以使用docker history ImageName/ImageID 查看镜像,只有一层

总结

docker 容器的基本操作,主要是上面的 几个命令,掌握基础操作之后,我们就开始进入到docker 容器的学习了,我们下一篇文章再见。

记得操练下哦。

查看原文