docker常用命令

一、配置镜像加速网站

一般镜像网站都是国外拉取很慢,所以自定配置国内镜像网站,像我这里使用自己阿里云账号提供的镜像地址
以下配置方法配置镜像加速器,是针对Docker客户端版本大于 1.10.0 的用户,如果低于这个版本,镜像加速配置方法可以百度找到就比较复杂一点
通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

[root@master ~]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://t5utj2u4.mirror.aliyuncs.com"]
}
[root@master ~]#

此处使用自己阿里云账号页面提供的镜像地址即可。

重启docker

systemctl daemon-reload
systemctl restart docker

检查是否生效

docker info
Registry Mirrors:
  https://t5utj2u4.mirror.aliyuncs.com/

二、基本常用命令

查看本机镜像

[root@localhost ~]#docker images

搜索centos相关镜像

[root@localhost ~]#docker search centos

拉取镜像

[root@localhost ~]#docker pull centos

docker中拉取指定版本的镜像
比如:

docker pull centos:7
docker pull mongo:3.6.6
dockre pull redis:4.0

简单测试使用镜像
docker: Docker 的二进制执行文件。
run:与前面的 docker 组合来运行一个容器。
centos指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 下载公共镜像。
/bin/echo “Hello world”: 在启动的容器里执行的命令

[root@localhost ~]# docker run centos /bin/echo "hello-world"
hello-world

删除镜像

[root@localhost ~]#docker rmi 镜像ID

进入容器
-t 在新容器内指定一个伪终端或终端。
-i 允许你对容器内的标准输入 (STDIN) 进行交互

[root@localhost ~]# docker run -it centos /bin/bash
[root@678b1725d9e3 /]# ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@678b1725d9e3 /]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@678b1725d9e3 /]# 

使用exit或ctrl+d退出容器

[root@678b1725d9e3 /]# exit                    
exit
[root@localhost ~]# 

exec 命令 ID 或者 name

docker exec -it mynginx /bin/bash

后台模式
-d 在后台运行容器并打印容器ID

[root@localhost ~]# docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done"
f66c5f63b4f5a6ca4d37575682e181fe8697c51db89d49ff0e59060c18a00b70

在输出中,我们没有看到期望的"hello world",而是一串长字符
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
这个长字符串叫做容器ID,对每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么。
首先,我们需要确认容器有在运行,可以通过 docker ps 来查看容器ID

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
f66c5f63b4f5        centos              "/bin/sh -c 'while t…"   4 minutes ago       Up 4 minutes                                      laughing_keldysh

CONTAINER ID:容器ID
NAMES:自动分配的容器名称
在容器内使用docker logs命令,查看容器内的标准输出
[root@localhost ~]#docker logs f66c5f63b4f5

停止容器

[root@localhost ~]#docker stop f66c5f63b4f5
f66c5f63b4f5

删除容器或镜像

[root@localhost ~]# docker rm 容器ID

强制删除运行的容器

[root@localhost ~]#  docker rm -f 容器ID

杀死所有正在运行的容器

docker kill $(docker ps -a -q)

删除所有已经停止的容器

docker rm $(docker ps -a -q)

删除所有未打 dangling 标签的镜像

docker rmi $(docker images -q -f dangling=true)

删除所有镜像

docker rmi $(docker images -q)

docker rm 可以删除容器 ;但是删除之前必须是 stop 状态;

查看容器

docker ps :列出当前所有正在运行的container
docker ps -l :列出最近一次启动的container
docker ps -a :列出所有的container(包含历史,即运行过的container)
docker ps -q :列出最近一次运行的container ID

获取所有容器ID

docker ps -a | awk '{ print $1}' | tail -n +2

Docker 端口映射

# docker run -d P sevrer
# docker run -d p port:port server
-d 后台运行;
-P -p 标识来指定容器端口绑定到主机端口。
两种方式的区别是:
-P : 是容器内部端口随机映射到主机的高端口。
-p : 是容器内部端口绑定到指定的主机端口。

默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp
使用IP:HostPort:ContainerPort格式指定映射使用一个特定的地址

docker port ID/name 查看端口绑定
docker port website
docker run -d -p 4594:22 --name myos --privileged=true centos:latest /usr/sbin/init

启动容器报错问题
结束容器进程,清除网络映射。重启网卡 再起docker 启容器。
关闭进程

pkill docker

清除 nat 规则

iptables -t nat -F

关闭网卡

ifconfig docker0 down

删除 虚拟网桥

brctl delbr docker0

最后重启docker后解决

查看WEB 应用程序日志

docker logs [ID或者name] 可以查看容器内部的标准输出。
docker logs name
docker logs -f name  实时查看日志

查看容器进程

docker top webstie

查看Docker 的底层信息

docker inspect ;
docker inspect website 

使用 docker inspect 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。

更改运行容器的名称

docker ps 查看运行的容器;
docker rename myweb youweb

启动docker容器并在退出时自动删除

docker run -it --rm nginx /bin/bash

以上命令就是以命令行方式启动docker容器,并在退出时自动删除,使用bash作为当前shell

启动运行 nginx 容器示例

docker run -d nginx 后台运行 ;
docker exec :在运行的容器中执行命令
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
docker exec -it mynginx /bin/sh

docker commit 编辑镜像
从容器创建一个新的镜像;

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit -a "name" -m "my-tomcat" website my-tomcat:v2
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停;

容器上传下载 拷贝文件cp

上传测试文件:
docker cp start-kube.sh website:/root/

下载文件 docker cp 
docker cp website:/test.html /root/

进入容器:

docker exec -it website /bin/bash

diff 查看容器的目录结构

docker diff ID/NAME
# docker diff webstie

配置一个centos系统并设置密码

docker pull centos
docker tag centos:latest centos:v1
docker run -d -p 4594:22 --name myos --privileged=true centos:v1 /usr/sbin/init
docker exec -it myos /bin/bash
 ss -ntl
 yum install openssh-server
 systemctl restart sshd
  ss -ntl
  yum install passwd
  passwd 
 yum install initscripts net-tools

Docker容器里的centos、unbuntu无法使用 systemctl 命令的解决方案
例如:centos

docker run -d -it -p 4590:22 --privileged=true --name myos myos:v1
docker exec -it myos /bin/bash

注意:--privilaged=true一定要加上的。

docker容器设置自动启动
启动时加--restart=always

docker run -tid --name myos -p 8081:8080 --restart=always -v /os/v1/log:/usr/local/tomcat/logs myos
    Flag    Description
    no      不自动重启容器. (默认value)
    on-failure  容器发生error而退出(容器退出状态不为0)重启容器
    unless-stopped  在容器已经stop掉或Docker stoped/restarted的时候才重启容器
    always  在容器已经stop掉或Docker stoped/restarted的时候才重启容器

如果已经启动的项目,则使用update更新:

docker update --restart=always myos

设置容器主机名和DNS

h HOSTNAME 或者 --hostname=HOSTNAME
--dns=IP_ADDRESS  使用指定的DNS服务器

使用-v选项共享物理机文件数据

-v /etc/hosts:/etc/hosts

当然此法适用于容器hosts与宿主机hosts内容一致的情况

推荐阅读更多精彩内容