Docker安装及相关操作
Docker安装
1. 安装官方脚本
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2. 安装 Docker Engine-Community
-
设置仓库
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
-
配置config(清华源)
sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
-
安装 Docker Engine-Community
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
-
列出可用版本,然后选择并安装
yum list docker-ce --showduplicates | sort -r
-
安装特定版本
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
如:列表可用版本为 docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
则<VERSION_STRING>:docker-ce-18.09.1
3. 启动、停止、查看状态、重启、开机自动启动DOCKER
sudo systemctl start docker
sudo systemctl stop docker
sudo systemctl status docker
sudo systemctl restart docker
sudo systemctl enable docker
4. 测试是否安装成功
sudo docker run hello-world
5. 卸载DOCKER
yum remove docker-ce
Docker使用
一、镜像相关
1.查看镜像
docker images
REPOSITORY:镜像名
TAG:版本
2.搜索镜像
docker search <镜像名>
NAME:仓库名称
DESCRIPTION:镜像描述
STARS:用户评价
OFFICIAL:是否官方
AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的
3.拉取镜像
docker pull <镜像名>
例:docker pull centos:7
4.构建镜像
1.创建一个Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像
一般dockerfile包含三部分:1.环境依赖 2.路径 3.项目入口命令
FROM 指定基础镜像,用于后续的指令构建。 MAINTAINER 指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令) LABEL 添加镜像的元数据,使用键值对的形式。 RUN 在构建过程中在镜像中执行命令。 CMD 指定容器创建时的默认命令。(可以被覆盖) ENTRYPOINT 设置容器创建时的主要命令。(不可被覆盖) EXPOSE 声明容器运行时监听的特定网络端口。 ENV 在容器内部设置环境变量。 ADD 将文件、目录或远程URL复制到镜像中。 COPY 将文件或目录复制到镜像中。 VOLUME 为容器创建挂载点或声明卷。 WORKDIR 设置后续指令的工作目录。 USER 指定后续指令的用户上下文。 ARG 定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。 ONBUILD 当该镜像被用作另一个构建过程的基础时,添加触发器。 STOPSIGNAL 设置发送给容器以退出的系统调用信号。 HEALTHCHECK 定义周期性检查容器健康状态的命令。 SHELL 覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。
指令 具体说明 COPY COPY [–chown=:] <源路径1>… <目标路径>
COPY [–chown=:] [“<源路径1>”,… “<目标路径>”]
例如:COPY hom* /mydir/
COPY hom?.txt /mydir/ADD 优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。CMD 类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在docker run 时运行。
RUN 是在 docker build。WORKDIR WORKDIR <工作目录路径> EXPOSE 声明端口,在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口
EXPOSE <端口1> [<端口2>…]2.使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像
$ docker build -t flaskr:2.0 . -t :指定要创建的目标镜像名 . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
3.push到仓库
$ docker push <repo:port>/flaskr:2.0
5.删除镜像
按ID删除:docker rmi <镜像ID>
删除所有镜像: docker rmi `docker images -q`
二、容器相关
1.查看容器
查看正在运行的容器:docker ps
查看所有容器:docker ps -a
2.创建与启动容器
创建容器命令:docker run
-i: 表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-name :为创建的容器命名。
-V:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个一V做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i-t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射(1)交互式创建容器(退出后自动停止)
docker run -it --name = 容器名称 镜像名称:标签 /bin/bash
(2)守护式创建容器
docker run -di --name = 容器名称 镜像名称:标签
进入创建的容器:docker exec -it <容器名称> /bin/bash
3.停止与启动容器
停止容器:
docker stop <容器名称或ID>
启动容器:
docker start <容器名称或ID>
4.文件拷贝
把文件拷贝到容器中
docker cp <文件目录或文件> <容器名称>:<容器目录>
从容器中拷贝出来
docker cp <容器名称>:<容器目录> <文件目录或文件>
5.目录挂载
在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器 添加-v参数 后边为 宿主机目录:容器目录,例如:
docker run -di -V /usr/local:/usr/local --name=<容器名称> <镜像名称>
6.查看容器IP
查看该容器所有信息:docker inspect <容器名称> 信息中的"NetworkSettings":"IPAddress"即容器IP
直接查看IP:docker inspect --format='{{.NetworkSettings.IPAddress}}' <容器名称>
7.删除容器
docker rm <容器名称> 注意:镜像删除是 docker rmi <镜像名称>
8.创建私人仓库并进行push和pull
Docker Registry是官方提供的工具,可以用于构建私有镜像仓库
1.下载镜像Docker Registry
docker pull registy
2.运行私有库Registry,相当于本地有个私有Docker hub
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
3.创建一个新镜像(具有ifconfig的flaskr)
docker run -it flaskr /bin/bash apt-gte upadte apt-get install net-tools
4.curl验证私服库上有什么镜像
curl -XGET http://192.168.233.134:5000/v2/_catalog
5.将新镜像修改符合私服规范的Tag
格式为:docker tag <镜像名>:Tag HOST:PORT/Repository:tag docker tag flaskr:2.0 192.168.32.128:5000/myflaskr:2.0
6.修改json配置文件使之支持http**(别忘了逗号)**,改完后重启docker
vim /etc/docker/daemon.json { "registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"], "insecure-registries": ["192.168.233.234:5000"] }
tips:json文件使用“//”进行注释
7.push到私服库
docker push 192.168.233.134:5000/myflaskr:2.0
8.再次curl验证私服库上有什么镜像
curl -XGET http://192.168.233.134:5000/v2/_catalog
9.pull到本地运行
docker pull 192.168.233.134:5000/v2/_catalog
Docker使用过程中遇到的问题
1.连接 Docker守护进程失败
报错信息:Job for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “journalctl -xe” for details.
解决方法:/etc/docker/daemon.json 格式不对
正确格式:
2.创建私人仓库后push连接失败问题
1.启动registry
docker run -d <IMAGE ID>
发现没有暴露端口
查看端口是否占用:netstat -anlp | grep 5000 杀死没有暴露端口的registry进程:docker kill <IMAGE ID> 清除没有暴露端口的registry进程:docker rm <IMAGE ID> 给定端口映射:docker run -d -p 5000:5000 <IMAGE ID>
之前停了 systemctl restart docker