手把手教你玩转docker(一)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 手把手教你玩转docker

docker操作

1、镜像资源的操作

[root@little ~ ]#docker image

Usage: docker image COMMAND

Manage images

Commands:

build Build an image from a Dockerfile

history Show the history of an image

import Import the contents from a tarball to create a filesystem image

inspect Display detailed information on one or more images

load Load an image from a tar archive or STDIN

ls List images

prune Remove unused images

pull Pull an image or a repository from a registry

push Push an image or a repository to a registry

rm Remove one or more images

save Save one or more images to a tar archive (streamed to STDOUT by default)

tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

Run ‘docker image COMMAND --help’ for more information on a command.

1)后面直接跟命令就可以进行相关操作:

[root@little ~ ]#docker image history

“docker image history” requires exactly 1 argument.

See ‘docker image history --help’.

Usage: docker image history [OPTIONS] IMAGE

Show the history of an image

2)搜索镜像资源:

[root@little ~ ]#docker search nginx

查看相关镜像来源以及使用量

从网上下载镜像资源:

[root@little ~ ]#docker image pull nginx

Using default tag: latest

latest: Pulling from library/nginx

45b42c59be33: Pull complete

8acc495f1d91: Pull complete

ec3bd7de90d7: Pull complete

19e2441aeeab: Pull complete

f5a38c5f8d4e: Pull complete

83500d851118: Pull complete

Digest: sha256:f3693fe50d5b1df1ecd315d54813a77afd56b0245a404055a946574deb6b34fc

Status: Downloaded newer image for nginx:latest

docker.io/library/nginx:latest

image id一样对应的是一个镜像,不同版本是在同一镜像基础上创建不同标签

3)查看有哪些镜像资源:

docker image ls

简写: docker images

4)删除镜像:

docker image rm 镜像名

简写: docker rmi 镜像名 这样只是删除一个标签

如果想彻底删除镜像,后面跟image id

5)镜像重命名:

docker tag 原镜像名:版本名 新镜像名:版本名

tag重命名是在原来的基础上新建一个新的,不改变原有存在的

标准的命名是:

registry_name/repository_name/image_name:tag

registry_name是注册服务器名字

repository_name是我们在docker.io上面注册的用户名

更改TAG为none的名称使用image id修改

docker tag 4cdc5dd7eaad nginx:latest

6)将本地镜像推送到docker.io

先登录账号:

登录公共仓库:

[root@little ~ ]#docker login docker.io

Login with your Docker ID to push and pull images from Docker Hub. If you don’t have a Docker ID, head over to https://hub.docker.com to create one.

Username: litxxxd

Password:

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

先按标准命名规范将镜像改名,docker.io可以省略:

[root@little ~ ]#docker tag centos7.8:latest docker.io/littlefun91/centos7.8:v1.0

然后直接推送:

[root@little ~ ]#docker push littlefun91/centos7.8

littlefun91/centos7.8 littlefun91/centos7.8:v1.0

[root@little ~ ]#docker push littlefun91/centos7.8:v1.0

The push refers to repository [docker.io/littlefun91/centos7.8]

fb82b029bea0: Mounted from daduber/centos7.8.2003

v1.0: digest: sha256:50b9a3bc27378889210f88d6d0695938e45a912aa99b3fdacfb9a0fef511f15a size: 529

这样就将本地镜像推送到docker.io自己的账户

镜像打包给别人用:

docker save -o 打包后的名(nginx.tar) 镜像名(nginx)

[root@little ~ ]#docker save -o nginx.tar nginx

[root@little ~ ]#ll

total 134096

-rw-r–r-- 1 root root 53 Feb 3 15:21 allip.txt

-rw-------. 1 root root 1564 Dec 29 20:19 anaconda-ks.cfg

-rwxr-xr-x 1 root root 109 Jan 31 11:06 date_test.py

-rw------- 1 root root 137274368 Feb 20 15:37 nginx.tar

-rwxr-xr-x 1 root root 133 Jan 31 11:40 py_shell2.py

-rwxr-xr-x 1 root root 67 Jan 31 11:20 py_shell.py

-rwxr-xr-x 1 root root 654 Feb 3 18:55 python_ping.py

-rwxr-xr-x 1 root root 120 Feb 3 15:30 shell_ping.sh

drwxr-xr-x 2 root root 24 Feb 2 20:17 static

-rw-r–r-- 1 root root 106 Jan 15 22:02 test.sh

-rw-r–r-- 1 root root 59 Feb 3 12:26 终端命令获取参数.py

在当前目录生成了打包后的镜像文件

7)导入压缩包镜像文件:

[root@little ~ ]#docker load -i nginx.tar

9eb82f04c782: Loading layer [>] 72.49MB/72.49MB

ffd3d6313c9b: Loading layer [>] 64.73MB/64.73MB

9b23c8e1e6f9: Loading layer [>] 3.072kB/3.072kB

0f804d36244d: Loading layer [>] 4.096kB/4.096kB

9f65d1d4c869: Loading layer [>] 3.584kB/3.584kB

2acf82036f38: Loading layer [>] 7.168kB/7.168kB

Loaded image: nginx:latest

2、容器的操作

容器是镜像的一个运行实例,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。容器是由镜像实例化而来的

如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用,

那么Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。

docker ps -a 列出所有启动的容器,包括运行的和退出的

一、创建容器

1. 新建容器

使用docker create命令新建一个容器,-t选项让Docker分配一个伪终端并绑定到容器的标准输入上,

-i则让容器的标准输入保持打开。

docker create -it ubuntu:latest

使用docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。

2. 启动容器

使用docker start命令来启动一个已经创建的容器

$ docker start af


通过docker ps命令查看一个运行中的容器,ps -a 查看所有容器

只显示容器的id: docker ps -q 或者 docker ps -qa   -q是只列出container IDs

另起一个终端,查看正在运行的容器:
docker container ls


3. 新建并启动容器

docker run 等价于先执行docker create命令,再执行docker start命令 -it

docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

$ docker run -it --name ccc ubuntu:18.04 /bin/echo 'Hello World'
--name 设定容器名字 不设置随机生成

[root@220 ~ ]# docker run -dit --name myngix nginx /bin/sh
 
[root@220 ~ ]# docker run -dit -p 8022:80 nginx   启动时,一般镜像放最后 后面只能跟命令或参数


当利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:

1)检查本地是否存在指定的镜像,不存在就从公有仓库下载;

2)利用镜像创建一个容器,并启动该容器

3)分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;

4)从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;

5)从网桥的地址池配置一个IP地址给容器;

6)执行用户指定的应用程序;

7)执行完毕后容器被自动终止;

命令执行后出错,会默认返回错误码,默认情况下,常见错误代码包括:

1) 125:Docker daemon执行出错,例如指定了不支持的Docker命令参数;

2) 126:所指定命令无法执行,例如权限出错

3) 127:容器内命令无法找到。

docker run -v参数

格式:

-v 本地目录:容器目录 或 -v 容器目录

-v /usr/local/docker_registry:/var/lib/registry

把主机的/usr/local/docker_registry 目录挂载到registry容器的/var/lib/registry目录下

假如有删除容器操作,我们的镜像也不会被删除

其他参数:

-d: 后台运行容器 后台运行无需添加命令

-p: 端口映射 5005:5004  指定主机的5005端口映射到容器的5004端口

-i: 表示启动一个可交互的容器,并持续打开标准输入

-t: 表示使用终端关联到容器的标准输入输出上

-it: 以交互模式运行启动容器

  在Docker容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据。
  
  --rm: 容器退出时就删除容器
  --name: 给容器命名,不命名会随机生成
  
  但是,对于foreground容器,由于其只是在开发调试过程中短期运行,其用户数据并无保留的必要,
  因而可以在容器启动时设置--rm选项,这样在容器退出时就能够自动清理容器内部的文件系统
  方便一次性运行容器
  
  在宿主机上可以看到docker的进程
  
  参数
     -a, --attach=[] Attach to stdin, stdout or stderr.
     -c, --cpu-shares=0 CPU shares (relative weight) ---------------------# 设置cpu使用权重
     –cidfile="" Write the container ID to the file ------------------------ # 把容器id写入到指定文件
     –cpuset="" CPUs in which to allow execution (0-3, 0,1) ----------------- # cpu绑定
     -d, --detach=false Detached mode: Run container in the background, print new container id -----# 后台运行容器
     –dns=[] Set custom dns servers ---------------- # 设置dns
     –dns-search=[] Set custom dns search domains -------------- # 设置dns域搜索
     -e, --env=[] Set environment variables ---------------- # 定义环境变量
     –entrypoint="" Overwrite the default entrypoint of the image
     –env-file=[] Read in a line delimited file of ENV variables ----- # 从指定文件读取变量值
     –expose=[] Expose a port from the container without publishing it to your host -------- # 指定对外提供服务端口
     -h, --hostname="" Container host name ---------- # 设置容器主机名
     -i, --interactive=false Keep stdin open even if not attached ------------------ # 保持标准输出开启即使没有attached
     –link=[] Add link to another container (name:alias) ----------- # 添加链接到另外一个容器
     –lxc-conf=[] (lxc exec-driver only) Add custom lxc options --lxc-conf=“lxc.cgroup.cpuset.cpus = 0,1”
     -m, --memory="" Memory limit (format: , where unit = b, k, m or g) # ------------内存限制
     –name="" Assign a name to the container ----------------------- # 设置容器名
     –net=“bridge” Set the Network mode for the container ---------------- # 设置容器网络模式
     ***** ‘bridge’: creates a new network stack for the container on the docker bridge
     ***** ‘none’: no networking for this container
     ***** ‘container:<name|id>’: reuses another container network stack
     ***** ‘host’: use the host network stack inside the container.
     ***** Note: the host mode gives the container full access to local system services such as D-bus and is therefore considered insecure.
     -P, --publish-all=false Publish all exposed ports to the host interfaces -------- # 自动映射容器对外提供服务的端口
     -p, --publish=[] Publish a container’s port to the host ------------ # 指定端口映射
     ***** format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
     ***** (use ‘docker port’ to see the actual mapping)
     –privileged=false Give extended privileges to this container ------------ # 提供更多的权限给容器
     –rm=false Automatically remove the container when it exits (incompatible with -d) ---------------------------------------- # 如果容器退出自动移除和-d选项冲突
     –sig-proxy=true Proxify received signals to the process (even in non-tty mode). SIGCHLD is not proxied. # ?
     -t, --tty=false Allocate a pseudo-tty ---------- – # 分配伪终端
     -u, --user="" Username or UID ---------------- # 指定运行容器的用户uid或者用户名
     -v, --volume=[] Bind mount a volume (e.g., from the host: -v /host:/container, from docker: -v /container)
     ------------ # 挂载卷
     –volumes-from=[] Mount volumes from the specified container(s) ------------ # 从指定容器挂载卷-
     -w, --workdir="" Working directory inside the container -------------- # 指定容器工作目录

  
  

 4. 守护态运行

添加-d参数来实现守护态形式运行,容器启动后会返回一个唯一的id,可以通过docker ps来查看容器信息。

不会占用当前终端

$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

要获取容器的输也信息,可以使用docker logs命令(ce5为容器id前缀):

$ docker logs ce5

docker进程在宿主机上是可以查到的


二、终止容器

可以使用docker stop来终止一个运行中的容器,该命令格式为docker stop [-t|–time[=10]] [CONTAINER…]

首先向容器发送SIGTERM信号,等待一段超过时间(默认为10秒)后,

再发送SIGKILL信号来终止容器(ce5为容器id前缀 容器名):

$ docker stop ce5

docker kill命令会直接发送SIGKILL信号来强行终止容器

此外,当Docker容器中指定的应用终结时,容器也会自动终止。对于只启动了一个终端的容器,

用户通过exit命令或ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。

docker restart命令会将一个运行态的容器先终止,然后再重新启动它。

退出容器:
exit 退出后容器仍在运行
或 ctrl+D

三、进入容器

在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。

如果需要进入容器进行操作,有多种办法,包括使用官方的attach或exec命令,以及第三方的nsenter工具等。

1. attach命令

attach命令是Docker自带的命令,命令格式为:

docker attach [–detach-keys[=[]]] [–no-stdin] [–sig-proxy[=true]] CONTAINER

支持三个主要选项:

1) --detach-keys=[=[]]:指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q;

2) --no-stdin=true|false:是否关闭标准输入,默认是保持打开;

3) --sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为true;

当多个窗口同时用attach命令连到同一个容器的时候,所有窗口都会同步显示。

当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

2. exec命令

exec命令可以在窗口内直接执行任意命令。

docker exec [-d|–detach] [–detach-keys[=[]]] [-i|–interactive] [–privileged] [-t|–tty] [-u|–user[=USER]] CONTAINER COMMAND [ARG…]

比较重要的参数有

1) -i,–interactive=true|false:打开标准输入接受用户输入命令,默认为false;

2)–privileged=true|false:是否给执行命令以高权限,默认为false;

3)-t, --tty=true|false:分配伪终端,默认为false;使用终端关联到容器的输入输出

4)-u, --user=“”:执行命令的用户名或ID;

$ docker exec -it 243c32535da7 /bin/bash

3. nsenter工具

在util-linux软件包版本2.23+中包含nsenter工具。如果系统中的util-linux包没有该命令,

可以按照下面的方法从源码安装:

$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-;cd util-linux-2.24;
$ ./configure --without-ncurses
$ make nsenter && cp nsenter /usr/local/bin

为了使用nsenter连接到容器,还需要找到容器进程的PID,可以通过下面的命令获取:

PID = $(docker inspect --format "{{.State.Pid}}" <container>)

通过这个PID,就可以连接到这个容器:

$ nsenter --target $PID --mount --uts --ipc --net --pid

四、删除容器

使用docker rm命令为删除处于终止或退出状态的容器,命令格式为 删除容器名

docker rm [-f|–force] [-l|–link] [-v|–volumes] CONTAINER [CONTAINER…]

主要支持的选项包括

1) -f, --force=false:是否强行终止并删除一个运行中的容器

2) -l, --link=false:删除容器的连接,但保留容器

3) -v, --volumes=false:删除容器挂载的数据卷。

  一条命令实现停用并删除容器:
  docker stop $(docker ps -q) & docker rm $(docker ps -aq)
  
  删除退出的容器:
  for i in `docker ps -a |grep -i exit|awk '{print $1}'`;do docker rm $i;done


五、导入和导出容器

1. 导出容器

导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,

可以使用docker export命令,格式为

docker export [-o|–output[=“”]] CONTAINER。其中,可以通过-o选项来指定导出的tar文件名,

也可以直接通过重定向来实现

docker export是用来将container的文件系统进行打包的

docker export需要指定container,不能像docker save那样指定image或container都可以。

$ docker export -o hello1.tar a4d
$ docker export a4d > hello2.tar

将容器生成新的镜像资源
docker commit -p 容器名 打包成的新的资源名(镜像名)
-p暂停容器
[root@little ~ ]#docker commit -p mynginx nginx_with_curl
这样生成的镜像就是把容器中自己的操作固化到新的镜像中

镜像打包给别人用:
docker save -o 打包后的名(nginx.tar) 镜像名(nginx)

或者 docker save  镜像名(nginx) >打包后的名(nginx.tar)

2. 导入容器

导出的文件可以通过docker import命令导入变成镜像

docker import [-c|–change[=[]]] [-m|-message[=MESAGE]] file|URL - [REPOSITORY[:TAG]]

用户可以通过-c,–change=[]选项在导和的同时执行对容器进行修改的Dockerfile指令

导入压缩包镜像文件:

[root@little ~ ]#docker load -i nginx.tar 


即可以使用docker load命令来导入镜像存储文件到本地镜像库,
也可以使用docker import命令来导入一个容器快照到本地镜像库

两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),

而镜像存储文件将保存完整记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

总结一下docker save和docker export的区别:

docker save保存的是镜像(image),docker export保存的是容器(container);
docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。

[root@220 ~ ]# docker images 
 REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
 alpine                        latest    e66264b98777   9 days ago      5.53MB
 littlefun91/nginx_with_curl   v1.0      37ca15573013   15 months ago   204MB
 nginx                         latest    37ca15573013   15 months ago   204MB

[root@220 ~ ]# docker ps -a
 CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS         PORTS                                   NAMES
  ae2577d47294   nginx     "/docker-entrypoint.…"   18 hours ago   Up 18 hours    0.0.0.0:8022->80/tcp, :::8022->80/tcp   magical_moser
  7475810896e5   alpine    "/bin/sh"                18 hours ago   Up 4 minutes                                           exciting_kirch

docker export是将容器导出

[root@220 ~ ]# docker export exciting_kirch >alpine.tar

导入时可以将镜像改名 改版本号
[root@220 ~ ]# docker import alpine.tar alpine:v2.23

[root@220 ~ ]# docker images 
 REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
 alpine                        v2.23     34a79b8ee961   5 seconds ago   5.53MB
 alpine                        latest    e66264b98777   9 days ago      5.53MB
 nginx                         latest    37ca15573013   15 months ago   204MB
 littlefun91/nginx_with_curl   v1.0      37ca15573013   15 months ago   204MB
 
 docker save 是将镜像导出:
 
 [root@220 ~ ]# docker save alpine >alpine.tar
 
 
 docker load 导入时啥也改不了,是原来的名称和版本号
 
 [root@220 ~ ]# docker load -i alpine.tar 
   Loaded image: alpine:latest
 [root@220 ~ ]# docker images 
   REPOSITORY                    TAG       IMAGE ID       CREATED         SIZE
   alpine                        latest    e66264b98777   9 days ago      5.53MB
   nginx                         latest    37ca15573013   15 months ago   204MB
   littlefun91/nginx_with_curl   v1.0      37ca15573013   15 months ago   204MB

手把手教你玩转docker(二):https://developer.aliyun.com/article/1495471

相关文章
|
Linux 应用服务中间件 nginx
[笔记]docker入门《二》之 docker介绍(一)
[笔记]docker入门《二》之 docker介绍
|
1月前
|
Linux 持续交付 Docker
掌握Docker:从入门到实践
Docker 是一个开源容器引擎,允许开发者将应用及其依赖打包成可移植的容器,在任意 Linux 机器上运行。本文从基本概念入手,详细介绍 Docker 的安装、基本操作、镜像构建及 Docker Compose 的使用,并通过实战案例展示如何部署 Web 应用、构建微服务架构及实现 CI/CD。通过学习,你将掌握 Docker 的核心功能,提升应用开发和部署效率。
|
4天前
|
运维 持续交付 虚拟化
docker入门详解!!!
本文介绍了容器技术的发展历程,从物理机到虚拟化再到容器化,重点讲解了Docker的诞生及其优势。Docker通过轻量级的容器技术,实现了资源的高效利用、快速启动、环境一致性、持续交付和部署等优点。文章还详细解析了Docker的架构和工作原理,包括Docker Daemon、REST接口、Docker Client等组件,以及容器与虚拟机的差异。
32 2
|
1月前
|
Ubuntu Linux 虚拟化
Docker入门实践(一)
Docker入门实践(一)
|
5月前
|
NoSQL Redis Docker
Docker再学习 - 实战
Docker再学习 - 实战
39 1
|
6月前
|
安全 Linux 数据库
Docker 入门详解
通过遵循这些步骤,你将能够快速入门 Docker 并开始探索容器化的世界,关注 V 哥,技术之路一起成长。
|
6月前
|
Linux 虚拟化 Docker
docker入门
docker入门
62 2
|
6月前
|
Shell iOS开发 Docker
|
6月前
|
应用服务中间件 Shell nginx
手把手教你玩转docker(二)
手把手教你玩转docker(二)
|
jenkins 应用服务中间件 Linux
[笔记]docker入门《二》之 docker介绍(二)
[笔记]docker入门《二》之 docker介绍(二)