docker 安装/常用命令

691 阅读7分钟

1. 安装

centOS

curl -sSL https://get.daocloud.io/docker | sh
# 或者
yum install docker-ce

window

直接从官网下载 https://www.docker.com/ ,自带 docker 和 docker-compose 命令

mac

安装brew

# 安装 Homebrew,官网 brew.sh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 根据输出可能需要将一两句话追加到你的 ~/.zshrc 去,可能是 ~/.bash_profile
echo 'export PATH="/opt/homebrew/bin:$PATH"' >> ~/.zshrc
echo 'export PATH="/opt/homebrew/sbin:$PATH"' >> ~/.zshrc

# 重新加载 profile 文件
source ~/.zshrc  # 可能是 ~/.bash_profile

# 关于 profile 文件名的选择,和修改之后需要重新加载 profile 文件,以后会用很多次,不会再专门提及了

# 查看版本
brew -v

安装docker

# 安装docker
brew install docker --cask
# 安装docker-compose
brew install docker-compose
# 安装 colima  Docker Desktop的免费开源的替代工具
brew install colima
# 启动Colima
colima start
# 验证 docker 启动
docker ps

2. 配置源

# 创建目录 
mkdir -p /etc/docker/
#创建 配置文件
vi /etc/docker/daemon.json 

# 这里必须是完整的配置,网上说只配置registry-mirrors 可能会导致docker启动失败
# 复制下面内容到daemon.json 

daemon.json

{
"registry-mirrors" : [
    "https://jkfdsf2u.mirror.aliyuncs.com",
    "https://registry.docker-cn.com"
  ],
  "insecure-registries" : [
    "docker-registry.zjq.com"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "10"
  },
  "data-root": "/data/docker"
} 

其他源:

{ "registry-mirrors": [ "https://mirror.ccs.tencentyun.com" ] } //腾讯云
{ "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com" ] } //163

方法2

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

3.启动/关闭

#版本
docker -v 

# 创建目录
mkdir -p /etc/docker/
#启动 关闭
sudo service docker start #启动 有效果
sudo service docker stop #停止
sudo service docker restart #重启
#systemctl 指令集合
systemctl start docker #启动
systemctl stop docker #停止
systemctl restart docker#重启
systemctl status docker #查看docker状态
systemctl enable docker #开机启动
# 启动方式2
dockerd

docker info #查看docker概要信息

4.常用命令

images

# 拉取指定镜像 
docker pull [images]:[version]从dockerhub拉取指定镜像
# 查看镜像信息列表 通过IMAGE ID 来启动
docker images  
# 删除镜像
docker rm  [IMAGE ID]
#停止所有container,这样才能够删除container,从而删除所有的images
docker stop $(docker ps -a -q)
#删除所有当前运行的容器
docker rm $(docker ps -a -q) 
#删除所有镜像
docker rmi $(docker images -q)

启动镜像

#直接前台启动,命令行会堵塞   -p代表端口映射 ([本地环境]:[docker环境]) -v 代表路径映射
docker run -p 8000:80 -v $PWD/www:/usr/share/nginx/html nginx 
#后台启动,命令行不堵塞  多了 -d代表后台运行
docker run -p 80:80 -v $PWD/www:/usr/share/nginx/html -d nginx   
# 调试启动 加 --rm 结束后会自动删除镜像方便调试
docker run --rm nginx   

查看运行中的所有容器 通过 CONTAINER ID 控制关闭

# 查看容器
docker ps -a 

停止/重启/杀死

# 停止容器
 docker stop [CONTAINER ID]
# 重启容器
docker restart [CONTAINER ID]
# 杀死容器
docker kill [CONTAINER ID]

5.run 与 exec

1.前台运行

docker run -it [IMAGE ID] /bin/bash

  • -i 以交互模式运行容器,通常与 -t 同时使用;
  • -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用; (不能单独使用否则会永无退出)
  • -d 后台运行容器,并返回容器ID;
  • -a, --attach 把指定的数据流(如 STDOUT 之类)连接至终端。若未指定,则默认连接 stdout 和 stderr。若数据流未指定,而容器以交互模式(-i)启动,则 stdin 也会被连接至终端。 此选项与 -d 选项不兼容

所有run 默认都是当前进程执行,是阻塞运行。 只有加了-d才在后台执行

# 当前立即执行 并且有交互的界面, 但是没有 linux 的Terminal那么好看
# 默认command命令是 /bin/bash
docker run -i   centos:7  

# 当前立即执行 并且有交互的界面,使用 linux 的Terminal
# 默认command命令是 /bin/bash
docker run -it   centos:7  
 
# 当前后台执行 并且有交互的界面,使用 linux 的Terminal
# 默认command命令是 /bin/bash
docker run -itd   centos:7  

# 修改当前的启动命令 ,执行完后会自动exit退出
docker run -itd   centos:7  /bin/ls

 
# 1. 启动直接进入容器
docker run -it --name=mycentos7 centos:7 /bin/bash
# exit 直接退出删除容器
exit


其他命令

-e, --env
docker run -e var1=val -e var2="val 2" debian env

-h, --hostname NAME  设置主机名
docker run -h "myhost" debian hostname

--volumes-from 挂载指定容器拥有的数据卷。经常用于数据容器

-p, --publish “发布”容器的端口

-P, --publish-all “发布”所有已指定为开放(exposed)的容器端口,使主机能访问它们。每

--expose  与 Dockerfile 的 EXPOSE 指令功能一样。

--entrypoint 把参数指定为容器的入口(entrypoint),

-u, --user 设置命令运行时所使用的用户。

-w, --workdir 将参数的路径设置为容器的工作目录。

2. 启动后后台运行

#创建并启动守护式容器 
docker run -di --name=mycentos2 centos:7 
#登录进入容器命令为:docker exec -it container_name (或者 container_id) /bin/bash(exit退出 时,容器不会停止) 
docker exec -it mycentos2 /bin/bash

# 不同linux 对应不同命令 /bin/bash  和  /bin/sh 
docker exec -it [CONTAINER ID] /bin/bash 
docker exec -it [CONTAINER ID] /bin/sh   

# 文件复制

docker cp [CONTAINER ID]: /test.js /  #复制镜像文件到 宿主主机上

#例子 第一个路径是 容器里面地址,第二个路径是宿主电脑   注意冒号要紧跟:/
docker cp [CONTAINER ID]:/usr/local/mongodb_backup /usr/local/mongodb_backup
#例子2 第一个路径是宿主电脑,第二个路径是 容器里面地址 注意冒号要紧跟:/
docker cp  /usr/local/mongodb_backup [CONTAINER ID]:/usr/local/mongodb_backup  


#  宿主电脑 默认docker volume 数据卷保存地址 
/var/lib/docker/volume

3.注意点

要让容器启动后不退出 有两个条件

    1. run启动的命令必须是阻塞的 比如 /bin/sh
    1. run启动同时要加上 -i 交互模式

所以下面这些命令 都无法让容器保持运行中

docker run  centos:7 /bin/sh
docker run -d  centos:7 /bin/sh 

只有下面这些才可以

docker run -i centos:7 /bin/sh 
docker run -i -d  centos:7 /bin/sh 

所以当下载了一个新的镜像,想进入看看里面内容可以使用下面命令

# 最好使用/bin/sh 不是所有镜像都支持/bin/bash 
docker run -it node /bin/sh

# 如果启动命令默认不是/bin/sh 等命令 ,则使用后台运行
docker run -itd node /bin/sh

# 修改 --entrypoint 启动命令内容 改为 /bin/sh 
docker run -itd --entrypoint /bin/sh node

6.容器管理

# 
docker attach [OPTIONS] CONTAINER
# 创建
docker create
# 复制
docker cp
docker exec
# 杀死进程
docker kill
ID=$(docker run -d debian bash -c \ "trap 'echo caught' SIGTRAP; while true; do sleep 1; done;") 
docker kill -s SIGTRAP $ID

# 暂停
docker pause
# 继续
docker unpause
# 重启
docker restart
# 删除 + 容器id
docker rm
# 启动容器
docker start
# 停止
docker stop

7. Docker信息

# docker所有信息
docker info
# 帮助文档
docker help
# 版本
docker version

8.容器信息


docker diff
ID=$(docker run -d debian touch /NEW-FILE) 
docker diff $ID

# 打印守护进程的实时事件。键入 Ctrl-C 退出
docker events 

# 把容器或镜像作为参数,获取它们的详细信息。
docker inspect 

# 输出容器的“日志”,也就是曾经输出到容器中的 STDERR 或 STDOUT 的内容。
docker logs 

# 把容器作为参数,列出它的端口映射信息
docker port 
ID=$(docker run -P -d redis) 
docker port $ID

# 容器进程
docker ps

# 把容器作为参数,提供该容器内运行中进程的信息。
docker top
ID=$(docker run -d redis) 
docker top $ID
ps -f -u 999
docker top $ID -axZ


# 镜像管理
# 构建
docker build
# 提交本地
docker commit
ID=$(docker run -d redis touch /new-file) 
docker commit -a "Joe Bloggs" -m "Comment" $ID commit:test
docker images commit
docker run commit:test ls /new-file

# 导出 将容器的文件系统中的内容以 tar 归档的格式导出,并输出到 STDOUT。生成的归档可以 通过 docker import 导入。 不包含数据卷
docker export

# 输出镜像中每个镜像层的信息。
docker history

# 显示镜像
docker images
docker images | head -4

# 导入 docker export的内容
docker import
docker export 35d171091d78 | docker import - flatten:test 
docker history flatten:test


# 导出同时导出多个
docker save
docker save -o images.tar ylzs-redis ylzs-php 
# 传送到指定服务器
scp ./images.tar root@xx.xx.xx.xxx:/文件夹路径

# 导入 save的内容
docker load
docker load < images.tar

# 将镜像与一个仓库和标签名称关联。
docker tag
# 上传本地镜像到 私有仓库## 修改标签
docker tag ylzs-nginx localhost:5000/ylzs-nginx
docker tag ylzs-node localhost:5000/ylzs-node

9.使用寄存服务器

#登录
docker login
#退出
docker logout 
# 拉取镜像 #通过 -a 参数可以下载仓库中所有镜像。
docker pull 
# 推送本地镜像
docker push
# 搜索列出 Docker Hub资源
docker search 

其他命令

# 查看容器配置
docker inspect 
# 启动 添加参数  
docker run -itd -e myname=jason --env password=123456  --entrypoint /bin/sh node

修改docker 默认的启动命令

方式1 直接在启动命令后面加上 自己的command

docker exec -it mycentos2 
# 默认等价于 
docker exec -it mycentos2 /bin/bash
# 只需要修改后面的command
docker exec -it mycentos2 /bin/ls

方式2 修改 容器文件夹的 config.v2.json(麻烦)

# 查找所有容器 包括退出,找到需要进入的 容器id
docker container ls -a
# 直接进行docker的文件夹路径 一般在 /data/docker/ 下
cd /data/docker/container 
# 根据上面找到的容器id 进入文件夹
cd 容器id
# 编辑config.v2.json
vi config.v2.json
# 修改 Path、Args,和Cmd 三个节点
# 对应修改 这三个地方
"Path":"/bin/bash"
"Args":[]
"Cmd":["/bin/bash"]


定制镜像

创建一个 Dockerfile 文件
  内容如下:
  FROM nginx:latest
  RUN echo '<h1>Hello, myfile!</h1>' > /usr/share/nginx/html/index.html
执行build 命令创建 (注意结尾有一个点) 代表当前路径
docker build -t nginx:myfile .
  运行 ( nginx:myfile 是别名)
  docker run -p 8000:80 nginx:myfile 

其他安装

docker-compose安装

#安装
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.10.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose


# 如果是自己下载好的docker-compose , 需要自己复制到 bin下 
cp ./docker-compose /usr/local/bin/docker-compose

#设置权限
chmod +x /usr/local/bin/docker-compose

安装图形化管理界面portainer

docker pull lihaixin/portainer
#创建文件夹
mkdir /var/run
# 启动镜像 
docker run -d -p 9006:9000 --restart=always \ 
-v /var/run/docker.sock:/var/run/docker.sock \
--name portainer lihaixin/portainer

# 查看是否生效
docker ps 
# 查看日志 
docker logs -f portainer

# 访问
http://127.0.0.1:9006

# 添加admin账号密码即可

注意点

docker默认没有的vi ps ll

# 安装vi vim
apt update
apt install vi
# 查看进程
ls -l /proc/*/exe
# 1xxxx 是对应的id
cat /proc/1xxxx/status

# ll 等价于
ls -l

私有仓库-搭建


# 拉取镜像
docker pull registry:2
# 启动
docker run -d -p 5000:5000 --restart always --name registry registry:2
# 创建镜像
docker pull nginx
docker tag nginx localhost:5000/nginx # 先给本地打上标签 记得需要用ip+端口
# 推送到私有服务器
docker push localhost:5000/nginx

# 查看镜像
docker images


# 另外一台服务器要访问
需要配置  /etc/docker/daemon.json 中的insecure-registries,不然会提示 不是https 不安全
{
"insecure-registries":["192.168.245.133:5000"],
"registry-mirrors": ["https://9fgss2yh.mirror.aliyuncs.com"]
}
# 重启docker
systemctl restart docker