Docker的安装及其日常使用
安装
Ubuntu安装
sudo apt update
- 更新软件包sudo apt -y install apt-transport-https ca-certificates curl software-properties-common
- 安装可能用到的依赖curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
- 添加阿里云源的密钥sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
- 添加阿里云源信息sudo apt update
- 更新索引库sudo apt-get remove docker docker-engine docker.io
- 如果存在docker需要先删除sudo apt install docker-ce
- 安装docker
Centos安装
uname -r
- 查看内核版本(centos7 64位要求3.10+,centos6 64位要求2.6+)yum update
- 更新底层库文件yum erase -y docker docker-common docker-engine
- 移除可能存在的旧版dockeryum install -y yum-utils device-mapper-persistent-data lvm2
- 安装工具包和依赖项yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 添加docker-ce源yum makecache fast
- 做本地缓存,加快安装速度yum -y install docker-ce
- yum安装dockersystemctl start docker
- 启动dockersystemctl enable docker
- 设置开机自启动
配置
配置主要就是更换docker源
Linux下更改国内镜像在/etc/docker/daemon.json
中添加以下代码
1 | { |
daocloud也可以下载镜像,且有较详细的配置参数
配置私服拉取镜像
1 | # /etc/docker/daemon.json |
也可以访问阿里云镜像服务,注册后获取镜像加速地址
命令
普通命令
docker version
- 查看docker版本docker info
- 查看详细信息docker network create isolated
- 创建docker网络
镜像管理
docker pull 镜像名
- 下载镜像docker images
- 查看所有本地的镜像docker search 镜像名
- 查找镜像docker rmi 镜像id/镜像名
- 删除镜像docker save -o 导出的路径 镜像id
- 导出镜像到文件docker load -i 镜像文件
- 加载本地到镜像文件docker tag 镜像id 镜像名:镜像版本
- 重命名镜像docker tag 旧镜像名:旧版本 新镜像名:新版本
- 复制一个镜像docker push 地址名/仓库名/镜像名:版本名
- 推送镜像
容器管理
docker run -d -p 80:80 --name mynginx --rm nginx:latest [command]
- 创建并运行容器,-d
- 后台运行-i
- 启动一个可交互的容器,并持续打开标准输入-t
- 终端关联到容器的标准输入输出上-p port1:port2
- 指定端口 外部端口:内部端口-v/--volume 外部文件夹:内部文件夹
- 数据卷操作,将外部文件夹映射到容器内部文件夹--link 容器名:自定义网络别名
- 给容器网络设置别名--name 容器名字
- 给创建的容器命名-e 环境变量名=环境变量值
- 设置容器全局变量--rm
- 为停止容器的时候容器自动删除镜像名:版本号
- 指定镜像和版本,latest为最新版本,默认不写也为最新版本command
- 表示运行容器时的启动命令
docker ps [-qa]
- 查看正在运行到容器-q
- 只查看容器到标识-a
- 查看全部到容器,包括未运行到容器
docker logs -f 容器id
- 查看容器到日志-f
- 可以滚动到查看日志到最后几行
docker exec -it 容器ID/容器名 bash
- 进入到容器内部命令行docker stop 容器名称/容器id
- 停止正在运行的容器docker stop $(docker ps -qa)
- 停止所有的容器docker rm -f 容器id
- 删除容器-f
- 强制删除容器(包括正在运行的容器)
docker start 容器名称
- 运行已经创建的容器docker restart 容器名称
- 重启正在运行的容器docker cp 文件名 容器id:容器内部路径
- 拷贝文件到容器中docker container ls -a
- 查看所有的容器,不加-a表示正在运行的容器docker container prune
- 清空所有容器docker inspect 容器id
- 获取容器底层信息IPAddress
- ip地址
数据卷
docker volume create 数据卷名称
- 创建数据卷- 创建数据卷之后,默认会存放在/var/lib/docker/volumes/数据卷名称/_data
docker volume inspect 数据卷名称
- 查看数据卷详细信息docker volumes ls
- 查看全部数据卷docker volumes rm 数据卷名称
- 删除数据卷docker run -v 数据卷名称:容器内部路径 镜像id
- 映射数据卷,会自动复制容器的文件到宿主机文件夹docker run -v 宿主机路径:容器内部路径 镜像id
- 直接指定一个路径作为数据卷的存放地址,这个地址是空的
自定义docker镜像
创建一个Dockerfile文件,并指定自定义镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#: 注释,指令大小写不敏感,但是建议指令大写,内容小写
FROM: 指定当前自定义镜像依赖的环境,dockerfile第一条非注释的命令必须是from
COPY: 将相对路径下的内容复制到镜像中
ADD: 将文件写入到镜像中(和copy的区别是copy是运行镜像时拷贝文件,add是构建镜像时拷贝进入)
WORKDIR: 生命镜像到默认目录
USER: 镜像中的启动用户名
RUN: 构建镜像时执行命令
ENV: 指定镜像中的环境变量
CMD: 需要执行的命令(在workdir下执行,可以写多个,以最后一个为准)
ENTRYPOINT: 如果dockerfile中没有run命令,则运行镜像中 /entrypoint.sh 文件,注意需要给执行权限
ARG: 用于指定传递给构建运行时的变量
EXPOSE: 指定于外界交互的端口
LABEL: 用于为镜像添加元数据
maintainer: 维护者信息
version: 版本信息制作镜像
docker build -t 镜像名称:[tag] .
-t
- 指定版本.
- 表示将当前目录下的文件编译为镜像
docker commit和docker build的区别
docker commit 容器id 自定义镜像名字
- 将容器打包成镜像docker build -t 镜像名称:[tag] .
- 通过dockerfile创建镜像
Docker-compoes
- 下载docker-compose文件,直接从github下载对应文件,修改文件的可执行权限并配置环境变量即可使用
- 编写docker-compose.yml文件
1 | version: '3' # 指定版本号,该配置为固定配置,根据不同的docker-compose决定 |
推送镜像到阿里云
- 首先在阿里云创建命名空间,相当于仓库名
docker login --username=王大锤 registry.cn-hangzhou.aliyuncs.com
本地登录阿里云docker tag 旧镜像名:旧版本 新镜像名:新版本
修改镜像名称
注意:新镜像名需要按照:阿里云地址/阿里云创建到命名空间/自定义名称或者阿里云创建的仓库名:版本
的格式docker push 新镜像名:版本号
推送到阿里云镜像仓库docker pull 新镜像名:版本号
将远端到镜像拉到本地
常见容器创建命令
docker run -d -p 6379:6379 --name redis-master redis:latest redis-server --requirepass 1qaz2wsx
- 创建一个redis容器并设置密码为1qaz2wsx
docker run -d -p 6380:6379 --link redis-master:redis-master --name redis-slave-1 redis:latest redis-server --slaveof redis-master 6379 --masterauth 1qaz2wsx
- 创建一个redis从机容器,并关联名称为redis-server的主机
docker run -d -p 3306:3306 -v /root/docker/mysql/conf:/etc/mysql/mysql.conf.d -v /root/docker/mysql/data:/var/lib/mysql --name mysql57 -e "MYSQL_ROOT_PASSWORD=123456" mysql:5.7.29
- 创建一个MySQL的容器设置数据库密码为123456并将做数据备份
常见故障
docker启动后命令无法使用
报错:Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json
: dial unix /var/run/docker.sock: connect: permission denied
原因:docker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,需要root权限才能访问。
解决办法:
- 获取root权限使用docker
- docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只要创建docker用户组,并将当前用户加入到docker用户组中,那么当前用户就有权限访问Unix socket了,进而也就可以执行docker相关命令
1 | sudo groupadd docker #添加docker用户组 |