Docker容器操作

avatar
作者
筋斗云
阅读量:0

一、启动容器

docker run 可以启动容器,进入到容器,并随机生成容器ID和名称。

容器常用命令:

docker ps 运行状态的容器
docker ps -a 是看所有的容器
docker ps -aq 看所有容器的id
docker create 建立容器
docker start 开启容器
docker stop 关闭容器
docker run 先去本地找镜像,没有就去网上仓库拉取,拉取后建立容器
docker cp 真机和容器之间复制文件
docker rm -f 强制删除容器
docker exec -it 容器名字(或id) sh 进入容器
docker top 容器id 查看容器中的进程
docker stats 容器id 查看容器的资源使用情况,动态的。docker stats --no-stream (一次性)
docker logs 容器id 查看容器日志

1.1 启动第一个容器

启动容器:容器,前提是要有镜像。通过docker images查看镜像

这时启动的容器是在前台运行的。在开一个终端,通过docker ps -a查看所有的容器

由于运行了一个容器,所以只能查看到一个容器。是Up状态。

ctrl+C关闭后,查看

退出状态。

1.2 启动容器的流程

一开始,Docker会在本机寻找镜像,判断本机是否有这个镜像,如果有就使用这个镜像运行。如果没有就去Docker Hub上 下载,Docker Hub是否可以找到,如果能找到,下载这个镜像到本地使用这个镜像,如果Docker Hub上也找不到就返回错误,找不到镜像。

1.3 启动容器用法

帮助: man docker-run 

命令格式:

docker run [选项] [镜像名] [shell命令] [参数] #选项:  

#选项
-i, --interactive   Keep STDIN open even if not attached,通常和-t一起使用
-t, --tty           分配pseudo-TTY,通常和-i一起使用,注意对应的容器必须运行shell才支持进入
-d, --detach         Run container in background and print container ID,台后运行,默认前台
--name string       Assign a name to the container
--h, --hostname string Container host name 
--rm                 Automatically remove the container when it exits
-p, --publish list   Publish a container's port(s) to the host
-P, --publish-all   Publish all exposed ports to random ports
--dns list           Set custom DNS servers
--entrypoint string Overwrite the default ENTRYPOINT of the image
--restart policy  
--privileged         Give extended privileges to container
-e, --env=[] Set environment variables
--env-file=[]       Read in a line delimited file of environment variables

1.4 后台启动容器

由于前面我们是前台启动的,会影响当前终端的操作环境,一般都使用后台启动。

1.5 设置容器退出后启动规则

policy说明
noDefault is no,Do not automatically restart the container when it exits.
on-failure[:max-retries]on-failure[:max-retries] Restart only if the container exits with a non-zero exit status. Optionally, limit the number of restart retries the Docker daemon attempts.
alwaysAlways restart the container regardless of the exit status. When you specify always, the Docker daemon will try to restart the container indefinitely. The container will also always start on daemon startup, regardless of the current state of the container.
unless-stoppedAlways restart the container regardless of the exit status, but do not start it on daemon startup if the container has been put to a stopped state before
[root@Node2 ~]#:docker run -d  --restart always nginx c705d36e04ed2faf8ccc4a20c3be0fc45e8a3a5c20b06131ef2b59e32201adcd [root@Node2 ~]#: [root@Node2 ~]#:docker ps -a CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS                      PORTS     NAMES c705d36e04ed   nginx     "/docker-entrypoint.…"   7 seconds ago    Up 6 seconds                80/tcp    keen_hellman 5f59606eb2e0   nginx     "/docker-entrypoint.…"   5 minutes ago    Up 5 minutes                80/tcp    agitated_wilbur 99aac3a864fd   nginx     "/docker-entrypoint.…"   21 minutes ago   Exited (0) 16 minutes ago             objective_bose

1.6 启动容器执行一次性的命令

        系统类的容器,启动后没有执行任何操作,不像  httpd,nginx需要持续向外提供服务, 所以系统类的默认是一次性的容器启动就退出。

执行一个打印输出的命令,命令执行结束直接退出。

执行一次命令后,立即退出。

1.7 使用命令将系统类容器持续运行

-i 表示要和容器进行交互

-t 分配一个运行终端。

开启容器,并进入容器。

开一个bash终端,进行交互界面。

 与系统共用内核,查看版本:

1.8 退出容器

如果直接使用 exit 那么容器也将停止。

在上面1.7中,已经演示了退出容器的操作,使用exit退出容器。

通过查看所有的容器发现,使用exit退出的容器,会直接退出容器,像不像废话,哈哈。也就是停止容器。

介绍另一种退出的方式:同时按三个键,ctrl + p + q 会退出容器,但容器不会停止。

1.9 启动容器时指定名称

在以上的启动容器中,不难发现,启动后有一个names。这个名字也是随机生成的。为了便于更好的区分容器,我们可以自定义取名字。

容器在启动的时候都会被分配到一个随机id和一个随机名字,也可以自定义设置名字

注意每个容器的名称要唯一。

1.10 设置容器内的名称

我们在上面1.7中登录进入容器后,看到的容器的名称是容器的id号,我们可以指定容器能的名称。使用-h选项,后跟容器名称:

docker run -it -h container1 nginx bash

 

1.11 测试容器,退出容器删除

在上面1.10中看到使用exit退出容器后,查看所有容器时,发现退出的容器也存在,并没有删除。需要手动删除。

 使用--rm,在退出容器时,可以直接删除掉没有运行的容器。

二、查看容器的状态

命令作用
docker ps查看容器的状态(看不到退出的,可以看到运行的)
docker ps -a查看容器的状态 包括退出的 , 和运行的
docker ps -a -s查看容器的状态 -s 查看容器的大小
docker ps -l查看最近的一个容器状态

2.1 显示当前存在容器

显示当前运行中的容器,使用命令docker ps

显示运行和停止的容器,即显示所有的容器,加-a选项。docker ps -a

如图:

 如果只显示停止的容器,使用-f选项,状态为exited

2.2 查看容器内的进程

语法:

docker top container [ps options]

查看nginx容器中的进程状态。

2.3 查看容器资源使用情况

docker stats [OPTIONS] [CONTAINER...]
Display a live stream of container(s) resource usage statistics
Options:
-a, --all             Show all containers (default shows just running)
    --format string   Pretty-print images using a Go template
    --no-stream       Disable streaming stats and only pull the first result
    --no-trunc       Do not truncate output

查看单个容器。

动态查看容器中的状态。docker stats [容器id]

查看所有,并且只运行一次  

2.4 查看容器的详细信息

docker inspect 可以查看docker各种对象的详细信息,包括:镜像,容器,网络等

docker inspect [OPTIONS] NAME|ID [NAME|ID...]
Options:
-f, --format string   Format the output using the given Go template
-s, --size           Display total file sizes if the type is container

例子:查看容器

inspect不仅可以查看容器详细信息,还可以查看镜像详细信息。

选择性查看: 元数据

 

 可以直接提取容器详细信息中的IP地址:

2.5 查看容器的日志

docker logs [OPTIONS] CONTAINER
选项:
--details       Show extra details provided to logs
-f, --follow     Follow log output
--since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37) or 
relative (e.g. 42m for   42 minutes)
--tail string   Number of lines to show from the end of the logs (default 
"all")
-t, --timestamps     Show timestamps
--until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or 
relative (e.g. 42m     for2 minutes)

日志显示太多了,可以显示前五条日志:

docker --tail 5 -t [容器id号]

也可以向宿主机上的查看日志一样使用使用-f选项实时查看:

2.6 关闭和开启容器

使用stop可以关闭容器

使用start开启容器:

三、删除容器

docker rm [容器id]

可以删除容器,即使容器正在运行当中,也可以被强制删除掉,加-f即可强制删除容器。

docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker container rm [OPTIONS] CONTAINER [CONTAINER...]

#选项:  
-f, --force     Force the removal of a running container (uses SIGKILL)

-v, --volumes   Remove the volumes associated with the container
#删除停止的容器
docker container prune [OPTIONS]
Options:
      --filter filter   Provide filter values (e.g. 'until=<timestamp>')
  -f, --force           Do not prompt for confirmation

删除容器,可以指定id,也可以指定名字。

 可以指定查看容器的状态, 显示出来。

四、进入容器

4.1 attach

        docker attach 容器名,attach 类似于vnc,操作会在同一个容器的多个会话界面同步显示,所有使用此方式进入容器的操作都是同步显示的,且使用exit退出后容器自动关闭,不推荐使用,需要进入到有shell环境的容器。

4.2 exec

        在运行中的容器启动新进程,可以执行单次命令,以及进入容器测试环境使用此方式,使用exit退出,但容器还在运行,此为推荐方。

格式:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
常用选项:  
-d, --detach               Detached mode: run command in the background
-e, --env list             Set environment variables
-i, --interactive         Keep STDIN open even if not attached
-t, --tty                 Allocate a pseudo-TTY
#常见用法
docker exec -it 容器ID sh|bash

一次性操作:

一次性操作执行命令后,会退出。

持久性操作:

退出后,依旧运行。

五、暴露容器的端口

5.1 暴露容器的随机端口

由于容器中运行着nginx服务。我们可以通过docker inspect [容器id]查看详细信息,找出IP地址。在宿主机访问该地址:

         容器启动后,默认处于预定义的NAT网络中,所以外部网络的主机无法直接访问容器中网络服务,docker run -P 可以将事先容器预定义的所有端口映射成宿主机的网卡的随机端口,默认从32768开始使用随机端口,当停止容器后再启动可能会导致端口发生变化。

-P , --publish-all = true | false默认为false

#示例:
docker run -P docker.io/nginx  #映射容器所有暴露端口至随机本地端口

docker port 可以查看容器的端口映射关系

格式:

docker port CONTAINER [PRIVATE_PORT[/PROTO]]

只提取IP地址,可以直接:

[root@Node2 data]#:docker inspect -f "{{.NetworkSettings.IPAddress}}" web1 172.17.0.2 

通过访问该本机的IP加端口

5.2 指定端口映射

除了随机端口外,还可以生成指定端口:

docker run -p 可以将容器的预定义的指定端口映射到宿主机的相应端口

注意: 多个容器映射到宿主机的端口不能冲突,但多个容器内使用的端口可以相同

5.2.1 容器80端口映射宿主机本地随机端口

docker run -p 80 -d --name apache httpd

5.2.2 容器80端口映射到宿主机本地端口81

docker run -p 81:80 --name httpd-apache httpd

-p 81:80                               -p 宿主机端口:容器中指定服务的端口

容器中的httpd服务主页面在:

5.2.3 宿主机本地IP:宿主机本地端口:容器端口

指定网卡,宿主机本地IP

如果宿主机有多个网卡,可以把容器的端口映射到指定网卡地址的指定端口上,由于我这里只有一块网卡:还指定在该网卡上。

docker run -p 192.168.114.20:82:80 -d --name zhiding_ApachePort httpd

docker run -p 本机地址:本机指定端口:容器端口 后台运行 指定名字 镜像

访问测试:

5.2.4 宿主机本地IP:宿主机本地随机端口:容器端口,默认从32768开始

宿主机的IP:宿主机IP的随机端口:容器中服务的端口。默认从32768开始

docker run -p 192.168.114.20::80 -d --name suiji_port httpd

测试;

5.2.5 宿主机本机ip:宿主机本地端口:容器端口/协议,默认为tcp协议

指定协议,默认是tcp。

docker run -p 192.168.114.20:83:80/udp -d --name ctner_udp httpd

5.2.6 一次性映射多个端口+协议

docker run -p 8080:80/tcp -p 8443:443/tcp -d --name some_port httpd

六、传递运行命令

        容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令,容器里的PID为1的守护进程的实现方式。

服务类: 如: Nginx,Tomcat,Apache ,但服务不能停

命令类: 如: tail -f /etc/hosts ,主要用于测试环境,注意: 不要tail -f <服务访问日志> 会产生不必要的磁盘IO。

拉取一个系统类的容器,alpine,他是一个及简版的系统。

把那些容器删除掉;清除一下。

运行系统类的容器时不可以持久,后台运行-d,也会自动退出 如下:

可以在运行时加入一些前台执行的命令,那么就可以持久执行:这个看到是前面一个

这里ls -l /etc/hosts是一次性命令,执行完就结束了。所以不会持久运行。

前台执行的命令实时执行的比如tail -f 命令。持久运行

七、容器内部的hosts文件本地域名解析文件

        容器会自动将容器的ID加入自已的/etc/hosts文件中,并解析成容器的IP。

例如:一次性查看主机名:

进入容器,查看主机名 

人为的修改 hosts 文件 --add-host 添加指定信息

添加了hosts文件。

八、指定DNS域名解析服务器

容器的dns服务器,默认采用宿主机的dns 地址,可以用下面方式指定其它的DNS地址

将dns地址配置在宿主机

在容器启动时加选项 --dns=x.x.x.x

在/etc/docker/daemon.json 文件中指定

例子: 容器的DNS默认从宿主机的DNS获取

[root@Node2 data]#:docker run -it --rm --name a1 --add-host www.alpi.com:6.6.6.6 --add-host www.accp.com:9.9.9.9 alpine

拉取一个centos的系统镜像: 

 指定容器的dns

九、容器内和宿主机之间复制文件

容器内与宿主机之间的文件复制:

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Options:
  -a, --archive       Archive mode (copy all uid/gid information)
  -L, --follow-link   Always follow symbol link in SRC_PATH

例子:docker cp 命令 容器宿主机之间的拷贝

将容器中的文件,拷到本地

语法:docker cp 容器id:要复制的文件路径/容器中的文件夹 本地路径

 将本地文件复制到容器中。

docker cp -a /data/test.txt fddb783057f8:/

十、容器传递参数

        有些容器运行时,需要传递变量,可以使用 -e <参数> 或 --env-file <参数文件> 实现

范例: 传递变量创建MySQL

变量参考链接: https://hub.docker.com/_/mysql

拉取一个mysql的镜像

运行容器, 添加属性

 删除容器id,添加属性。

进入容器,下载客户端工具。 

 准备变量文件

在最后添加两行,server-id和二进制

[root@Node2 data]#:vim /etc/my.cnf ...... server-id=100 log-bin=mysql-bin

 

通过查看m2对应的端口发现,容器中的3306对应我们指定的宿主机的端口3307。

---end---

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!