Docker笔记

安装

  1. 卸载旧版本以及相关的依赖项
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  1. 安装所需的软件包。
    yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  2. 安装 Docker Engine-Community
    列出并排序存储库中可用的版本
    yum list docker-ce --showduplicates | sort -r
    sudo yum install docker-ce- docker-ce-cli- containerd.io
  3. 启动docker
    sudo systemctl start docker

用户组

  1. 创建docker组
    sudo groupadd docker
    2.将当前用户加入docker组
    sudo gpasswd -a ${USER} docker
    3.重启服务
    sudo service docker restart
    4.刷新docker成员
    newgrp - docker

仓库

登录docker仓库
docker login -u user-p psw123 abc.com
登出
docker logout

镜像

拉取镜像
默认latest版本,-a拉去所有tagged镜像 默认存在 /var/lib/docker/
docker pull abc
重新定义镜像
docker tag [ImageId] xxx.com/abc:v1
推送镜像
docker push xxx.com/abc:v1
查看
docker images
删除
docker rm -f

容器

docker save 将指定镜像保存成 tar 归档文件
docker save -o img.tar imgName
-o:输出到的文件

docker load 导入使用 docker save 命令导出的镜像。
–input , -i : 指定导入的文件,代替 STDIN。
docker load -i abc.tar

执行docker load -i xxx.tar.gz时候报错open /xxx No such file or directory这种情况属于容器快照文件缺乏基础镜像导致的
因为docker使用了联名文件系统,即在基础镜像上覆盖一层可写层来执行其他操作。而容器快照文件只包含了上层操作,没有底层的基础镜像。这也是docker save保存的镜像压缩包和docker export保存的容器快照压缩包的区别。
实际应用的时候因为很多镜像都使用了同一个基础镜像,所以使用容器快照的话更节省资源,不需要每个镜像都加载基础镜像。
解决方案
一般容器快照文件都会包含minifest文件,找到minifest文件。里面会告诉你需要的基础镜像,docker load加载基础镜像之后docker load重新加载即可

docker export将文件系统作为一个tar归档文件导出到STDOUT
docker export > /home/export.tar
docker save基于镜像,export基于容器;expor导出的镜像文件大小,小于 save保存的镜像

docker import从归档文件中创建镜像
docker import xxx.tar xxx:v4

export导出(import导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史,所以无法进行回滚操作(docker tag  );而save保存(load加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。(查看方式:docker images --tree)

导入容器快照:cat docker/myImd.tar | docker import - test/myImg:v1
也可以通过指定url或者某个目录来导入docker import http://example.com/test.tgz example/test

docker start container_name/container_id # 通过容器名字或ID启动容器
docker stop container_name/container_id # 通过容器名字或ID停止容器
docker restart container_name/container_id # 通过容器名字或ID重启容器
docker rm container_name/container_id :删除一个或多个容器
-v :删除与容器关联的卷
-f :强制删除

docker rmi : 删除本地一个或多个镜像
-f :强制删除
–no-prune :不移除该镜像的过程镜像,默认移除;
docker rmi -f imgId/imgName:tag

镜像不被任何容器所使用的前提下,批量删除镜像:docker images | grep abc | awk ‘{print $1":"$2}’ | xargs docker rmi

注:导入加载进来觉得不合适可以使用 docker rm 容器ID 、 docker rmi 镜像ID 来删掉。
移除所有的容器和镜像
docker kill $(docker ps -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -q -a)
docker logs -f -t --since=“2017-05-31” --tail=100 container_name
docker ps -a | awk ‘{print $1}’ | xargs docker rm -f
使用Docker进行容器的创建:
docker info # 查看docker的信息

docker exec在运行的容器中执行命令
-d :分离模式: 在后台运行
-i :即使没有附加也保持STDIN 打开
-t :分配一个伪终端
docker exec -it container_name/container_id /bin/bash # 通过容器名字或ID进入容器
exit # 退出容器

docker run创建一个新的容器并运行一个命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
OPTIONS说明:
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-p: 指定端口映射,格式为:hostPort:containerPort 主机(宿主)端口:容器端口
–name= xxx: 为容器指定一个名称;
-h: 指定容器的hostname;
-e username=ritchie: 设置环境变量;
–volume , -v: 绑定一个卷

docker run -itd --name=container_name img_name # 使用img_name以交互模式在后台运行分配了伪终端的名为container_name的镜像

死循环进程,让他不停的循环下去,前台永远有进程执行,那么容器就不会退出了
docker run -d centos /bin/sh -c “while true; do echo hello world; sleep 1000; done”

使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it nginx:latest /bin/bash

docker update更新一个或多个容器的配置
更新容器重启策略:docker update --restart=always containerId
更新容器内存:docker update -m 500M f361b7d8465

docker inspect 获取容器/镜像的元数据
docker inspect nacos
docker inspect -f {{.Config.Hostname}} nacos

从容器里面拷文件到宿主机
docker cp apline:/usr/local/abc.sh /docker
从宿主机拷文件到容器里面
docker cp /docker/abc.sh apline:/usr/local/

批量删除docker镜像为none的方法
docker images|grep none|awk ‘{print $3}’|xargs docker rmi
或者
docker rmi $(docker images | grep “^” | awk “{print $3}”)

获取所有容器ID
docker ps -a -q
停止所有容器
docker stop $(docker ps -a -q)
删除所有停止的容器
docker rm $(docker ps -a -q)
删除所有的镜像
docker rmi $(docker images -q)
移除没有标签并且没有被容器引用的镜像,这种镜像称为dangling(摇晃的)镜像
docker image prune -a --filter “until=24h”
移除停止的容器
docker container prune
移除卷
docker volume prune
移除网络
docker network prune
移除所有,包括镜像、容器、网络、卷
docker system prune --volumes

配置阿里云镜像服务

  1. 登录进入阿里云镜像服务中心,获取镜像地址https://****.mirror.aliyuncs.com
  2. 在/etc/docker目录下找到在daemon.json文件(没有就新建),将下面内容写入
{
    "registry-mirrors": ["https://****.mirror.aliyuncs.com"],
	"insecure-registries":["192.168.9.68:80"]
}

“registry-mirrors”: [], #私库加速器
“insecure-registries”: [], #这个私库的服务地址
3. 重启daemon
systemctl daemon-reload
4. 重启docker服务
systemctl restart docker

基本开发流程

  1. 寻找基础镜像
  2. 基于基础镜像编写Dockerfile脚本
  3. 根据Dockerfile脚本创建项目镜像
  4. 将创建的镜像推送到docker仓库 (根据自身需要,可做可不做)
  5. 基于项目镜像创建并运行docker容器 (实现最终部署)

制作镜像

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

docker build [OPTIONS] 
--tag, -t,指定镜像的名字及tag
使用当前目录的Dockerfile构建镜像:docker build -t name:tag .
-f 指定Dockerfile文件位置
docker build -f /path/Dockerfile .

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。

// FROM 指定基础镜像
FROM nginx
// RUN执行命令。每一条RUN都会生成一层,一个需求尽量使用&&,减少RUN,即减少了分层
RUN echo '

Hello, Docker!

' > /usr/share/nginx/html/index.html RUN yum update && yum install -y vim \ //COPY 源路径下的package.json复制到新一层的镜像路径/user/src/app COPY package.json /usr/src/app/ // WORKDIR 指定工作目录。指定下层工作的目录为容器内的/data,尽量使用绝对目录 WORKDIR /data // ADD添加,ADD能自动解压文件。 ADD hello test/ // CMD 执行命令 CMD ["python", "app.py"] // ENV 设置环境变量 ENV VERSION=1.0 DEBUG=off \ NAME="Happy Feet" // VOLUMES 挂载 // EXPOSE 端口暴露 EXPOSE <端口1> [<端口2>...]

FROM构造的新镜像是基于哪个镜像
例如:FROM centos:v1

COPY拷贝文件或者目录到镜像,用法同ADD
例如:COPY ./startup.sh /startup.sh

MAINTAINER维护者信息
例如:MAINTAINER yanglin

ENTRYPOINT运行容器时执行的shell命令
例如:ENTRYPOINT [“/bin/bash”,“-c”,“/startup.sh”]
ENTRYPOINT /bin/bash -c ‘/startup.sh’

RUN构建镜像时运行的shell命令
例如:RUN [“yum”, “install”, “http”]
RUN yum install httpd

VOLUME指定容器挂载点到宿主机自动生成的目录或者其他容器
例如:VOLUME [“/path/to/dir”]

CMD运行容器时执行的shell命令
例如:CMD [“-c”,“/startup.sh”]
CMD [“/usr/sbin/sshd”,“-D”]

USER为RUN,CMD,ENTRYPOINT执行命令指定运行用户
例如:USER www
镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。

EXPOSE指定于外界交互的端口,即容器在运行时监听的端口
EXPOSE 8081 8082

WORKDIR为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录
例如:WORKDIR /data

ENV设置容器内环境变量
例如:ENV MYSQL_ROOT_PASSWORD 123456

HEALTHCHECK健康检查
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ ||exit 1

ADD拷贝文件或者目录到镜像,如果是URL或者压缩包会自动下载或者自动解压
例如:ADD hom* /mydir/

ARG在构建镜像时指定一些参数
例如:FROM centos:6
ARG age=100

Dockerfile中设置环境变量要用 ENV
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV PATH J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH

Docker Compose

Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器。
// 一般使用步骤:

1、创建一个空目录。
2、定义 Dockerfile,方便迁移到任何地方
3、编写 docker-compose.yml 文件
4、运行 docker-compose up 启动服务

安装docker-compose
curl -L https://github.com/docker/compose/releases/download/1.29.0/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x docker-compose

// docker-compose 常用命令:

// up 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作
docker-compose up [options] [SERVICE...]   // -d 比较常用,不会打印过程。
//down 停止 up 命令所启动的容器,并移除网络。——这里需要特别注意,up 启动的,不应该使用rm 去删除,因为这样无法删除网络
docker-compose down
// run 命令
docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
// ps 查看项目中的所有容器
docker-compose ps
// restart 重启服务
docker-compose restart [options] [SERVICE...]。
// stop start 停止和开启容器
docker-compose stop xxx
docker-compose start xxx
// kill 强制停止某容器
docker-compose kill -s SIGINT
// rm 删除指定或所有的服务容器
docker-compose rm -f [service]
// build 重建某个容器,在 Dockerfile 发生了改变的时候,可以重建image。然后再 up 运行起来所有的容器
docker-composer build    //重建所有容器
docker-compose build xxx   //重建指定容器
//exec 进入某个容器
docker-compose exec -it ct-phpfpm /bin/bash
// images 查看compose文件中包含的镜像
docker-compose images
// pull 拉取依赖
docker-compose pull [options] [SERVICE...]
// push 推送服务依赖的镜像到 Docker 镜像仓库。
docker-compose push
// port 打印某容器的映射端口
docker-compose port xxx
// config 验证 docker-compose 文件格式是否正确
docker-compose config// top 查看所有容器的进程
docker-compose top

docker-compose -f abc.yaml up -d blkboard

你可能感兴趣的:(docker)