一、启动容器
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 | 说明 |
---|---|
no | Default 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. |
always | Always 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-stopped | Always 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---