docker 笔记

本贴最后更新于 1597 天前,其中的信息可能已经水流花落

docker 和虚拟机的区别和优缺点

1.docker 是在宿主机上 一起共享操作系统
虚拟机是在操作系统上运行操作系统
2.docker 镜像小 便于传输和存储 后者镜像庞大
3.前者无额外性能损失 后者有额外的 CPU 内存消耗


在 centos 安装 Docker

1.安装一些必要的系统工具

yum install -y yum-utils device-mapper-persistent-data lvm2

2.添加软件源信息

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.更新 yum 缓存

yum makecache fast

4.安装 Docker-ce

yum -y install docker-ce

5.启动 Docker 后台服务

systemctl start docker

6.测试运行 hello-world

docker run hello-world

在 ubuntu 安装 docker

1.更换国内软件源,推荐中国科技大学的源

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list sudo apt update

2.安装需要的包

sudo apt install apt-transport-https ca-certificates software-properties-common curl

3.添加 GPG 密钥,并添加 Docker-ce 软件源,这里还是以中国科技大学的 Docker-ce 源为例

curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \$(lsb_release -cs) stable"

4.添加成功后更新软件包缓存

sudo apt update

5.安装 docker-ce

sudo apt install docker-ce

6.设置开机自启并 启动 docker

sudo systemctl enable docker sudo systemctl start docker

7.测试运行

sudo docker run hello-world

出现 Hello from Docker! 表示成功


docker 的卸载

1.查看所安装的 docker 版本

yum list installed | grep docker

2.remove 掉 docker

yum -y remove docker版本

3.删除镜像和容器

rm -rf /var/lib/docker

Image 镜像

镜像 就相当于类
一个镜像会产生多个容器 container

搜索点赞数大于 30 的镜像 OFFICIAL 为 OK 表示官方镜像:

docker search -s 30 nginx

查看持有的所有镜像

docker images (-a 显示所有属性 -q 只显示id) ps: REPOSITORY表示镜像的仓库源 TAG表示镜像版本标签 IMAGEID表示镜像ID

查看 image 的分从

docker history IMAGE ID

删除 image

单个:docker rmi ab8424e38efd(IMAGEID) 删除过程中出现Error response from daemon: conflict: unable to remove repository reference 先查看在使用的容器 docker ps -a 然后根据CONTAINER ID删除 container docker rm CONTAINER ID 或者强制删除 docker rmi -f ab8424e38efd(IMAGEID) 多个:docker rmi a b c 全部:sudo docker rmi -f $(docker images -q)

获取 image 方法 1-------利用 docker build 创建 image

1.创建一个文件夹 进入这个文件夹 然后创建 Dockerfile(就把这个file当作一个脚本 里面写入命令 执行这个文件 里面的命令也会去执行) 编写内容 (安装vim) FROM centos RUN yum -y install vim 保存退出 2.执行Dockerfile 创建docker-image docker build -t zhangzeshan(注册的dockerid)/centos-vim-new(image名字) .(代表运行的dockerFile是基于当前目录的) 3.执行之后 查看imgae 列表 dockers image 就会发现新创建了上面的iamge 并且进入这个image 发现已经装好了vim

获取 image 方法 2------- docker pull Registry(image 名字)---类似于 git 的拉取

//拉取ubuntu 14.04 拉取私人镜像也是同样的方法 docker pull ubuntu:14.04

自己创建一个 Image-----Base Image(基础镜像)

1.拉取 hello-world 镜像 (该镜像属于 baseImage)

docker pull hello-world

2.模仿做一个像上述的镜像 创建一个文件夹 hello-world

进入这个文件夹 创建hello.c 文件 编写内容 #include<stdio.h> int main(){ printf("hello-world"); }

3.通过 gcc 编译该文件 首先要进行 yum install glibc-static gcc

gcc -static hello.c -o hello

4.执行命令 查看是否输出 hello-world

./hello

5.创建 Dockerfile 文件 编写以下内容

FROM scratch ADD hello / CMD ["/hello"]

6.创建 image

docker build -t zhangzeshan/hello-world .

从 Dockerfile 构建一个镜像---(推荐!)

简写成 docker build

1.删掉上述的 image

docker image rm d34ef706b552(IMAGE ID)

2.创建目录用来存放 Dockerfile

mkdir docker-centos-vim 在这个文件夹下 创建Dockerfile 文件

3.编写内容

FROM centos RUN yum intall -y vim

4.根据 Dockerfile 创建镜像

docker build -t zhangzeshan(注册的dockerid)/centos-vim(镜像名字) .

5.查看所有镜像

会发现上面的命令 产生了一个zhangzeshan/centos-vim的镜像 docker images

6.使用这个镜像

docker run -it zhangzeshan/centos-vim 执行命令 vim 发现这个镜像也已经装了vim

7.build 过程中进行调试:

复制要调试的步骤的 id 去执行临时镜像 docker run -it 临时镜像id /bin/bash

Container 容器

有镜像才能创建容器

新建并启动容器

docker run options image commond -d :后台运行容器 并返回容器ID 也就是启动守护式容器 docker run -d centos (docker ps -a 会发现此时容器出于退出状态 所以要用以前台进程的形式运行 -it) -i :交互模式运行 通常与-t结合 如: docker run -it 6fa48e047721 (随机分配名字) docker run -it --name centos20191228 centos (自定义容器名字) docker run -i -t -d centos 后台运行容器 不显示终端交互 -P :随机端口映射(大写) i:hostPort:containerPort ip:containerPort hostPort:containerPort containerPort docker run -it -P tomcat 此时访问的端口就是为指定的默认端口tomcat的8080 -p :指定端口映射(小写) docker run -it -p 外部访问的端口:内部访问的端口 image名字 如:docker run -it -p 8080:8080 tomcat 这样就启动了tomcat服务 可以通过地址访问

启动容器

docker start id或者名字 进入容器并进行终端交互 docker exec -it 容器id /bin/bash 例如:sudo docker exec -it redis-web redis-cli

重启容器

docker restart id或者名

停止容器

docker stop id或者名字

强制停止(杀死正在运行的容器)

docker kill id或者名字

查看容器日志

docker logs -f -t --tail 容器id -t 加入时间戳 -f 不停的打印日志 --tail 数字 显示最后多少条 如:docker logs 9ebaa7e6f499

查看正在运行的容器

docker ps -a 列出当前所有正在运行的容器 docker ps -a -l 显示最近创建的容器(上一次) docker ps -l -n 显示最近n个创建的容器 (上n次) docker ps -n 2 -q 只显示容器编号 docker ps -q

查看容器下的进程

docker top 容器id

查看容器内部细节

docker inspect 容器id

进入容器(先进行 start)

docker exec -it 容器id 或者 docker attach 容器id exec: 在容器中打开新的终端 并且可以启动新的进程 此时没有进入容器的终端 但是却拿到容器的一些数据 如:docker exec -t id ls -l /tmp 不会进入容器内 但会输出文件夹下的列表信息 docker exec -it 6188f267da9a /bin/bash (会进入容器内) attach:直接进入容器启动命令的终端 不会启动新的进程 如:docker attach 6188f267da9a

从容器内拷贝文件到主机

在主机的终端执行 docker cp 容器id:要拷贝的地址 存放到主机的地址 docker cp 6188f267da9a:zhangzeshan.php /project/docker/

退出容器

1.容器停止并退出 exit 2.容器不停止并退出 ctrl + P + Q 执行exit出现情况:There are stopped jobs 执行kill %1 然后再次执行exit

删除容器

单个 docker rm id 多个 docker rm $(docke ps -aq)

清理所有退出状态的 container 加上 -f 为强制清理

docker rm -f $(docker ps -aq)

docker container commit -------根据容器来创建新镜像

docker commit -m="提交的描述信息" -a="作者" 容器 ID 要创建的目标镜像名:标签名
简写成 docker commit

一.构建自己的 Docker 镜像
1.进入 centos 镜像 此时就会产生一个 centos 的 container

docker run -it centos

2.进入之后 给这个 image 安装 vim

yum install -y vim

3.安装之后退出
4.通过命令 可以看到我们刚才退出的 image 会有对应的一个退出的 container

docker container ls -a

5.把这个 container commit 成 镜像

docker commit 50ae495256fb(NAMES的值) zhangzeshan(注册的dockerid)/centos-vim(镜像名字)

6.之后查看现有的镜像

docker images 会发现多了一个镜像 名字是 zhangzeshan/centos-vim

7.进入这个镜像

docker run -it zhangzeshan/centos-vim 然后输入vim 发现这个镜像是已经安装了vim的centos镜像

容器数据卷

实现数据持久化
docker 容器产生的数据 如果不通过 commit 生成新的镜像 使得数据作为镜像的一部分保存下来
那么 当容器删除后 数据自然也就没有了 为了能保存数据 在 docker 中使用卷
特点
1。数据卷可以在容器之间共享或重用数据
2。卷中的更改可以直接生效
3。卷中的更改不会包含在镜像的更新中
4。生命周期一直持续到没有容器使用它为止

容器内添加数据卷(也就是挂载)
一.直接命令添加(一对一)

docker run -it -v /主机的绝对路径:/容器内的路径 镜像名字 docker run -it -v /myDataVolume:/dataVolumeContainer centos 此时 主机和容器都会增加新的文件夹 此时他们之间就会同步 比如增加一个文件 两边都会有 查看是否挂载成功 根据当前的容器id 在主机执行命令 docker inspect 容器id 在出现的信息中 Binds 说明了之间已经成功挂载 不论容器是否在运行 主机在挂载项目做的任何动作都会同步 容器不能增删改查文件 docker run -it -v/myDataVolume:/dataVolumeContainer:ro centos

二.通过 dockerFile 添加

1.创建 docker 一个文件夹 并进入 2.在dockerFile中使用volume指令给镜像添加一个或多个数据卷 3.创建dockerFile #volume test FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "finished,-----success1" CMD /bin/bash 4.build成一个镜像 docker build -f dockerfile路径 -t 镜像名字 . 5.运行这个镜像 就会发现已经成功挂载 容器对应的内容 会同步在 主机的/var/lib/docker/volumes/下

Dockerfile

常用命令:
保留字指令必须全部大写 后面至少跟随一个参数 否则报错
指令从上到下执行
#表示注释
每条指令会创建一个新的镜像层 并进行提交

FROM

来自于哪个基础镜像 也就是镜像基于哪个镜像 也可以是自己所创建的镜像名 FROM centos

MAINTAINER

镜像维护者的姓名和邮箱地址 MAINTAINER The Centos Project <cloud-ops@centos.org>

RUN

容器构建时 需要运行的命令 RUN groupadd -r redis && useradd -r -g redis redis

EXPOSE

当前容器对外暴露的端口号 EXPOSE 6379

WORKDIR

指定创建容器之后 终端交互进来的默认工作目录 WORKDIR /usr/mytest

ENV

构建镜像过程中设置环境变量 ENV MY_PATH /usr/mytest 使用 WORKDIR $MY_PATH

ADD

将主机的文件 拷贝到镜像 并进行自动处理和解压

COPY

将主机的文件 拷贝到镜像 COPY /project/docker /usr/local/cincontainer.txt

VOLUME

数据卷 挂载

CMD

指定容器启动时 要执行的命令 允许多个CMD指令 但只有最后一个生效 并且会被docker run 之后的参数替换掉 exec格式:CMD ["可执行文件","参数1","参数2"] shell格式:CMD <命令> CMD /bin/bash 启动容器的时候 docker run -it centos ls -l 此时 ls -l 会覆盖掉dockerfile的 CMD命令的内容 而 ENTRYPOINT 是 run 后面的参数 会追加到 ENTRYPOINT参数组合成新的命令 比如 ENTRYPOINT ["curl","-s","http://ip.cn"] 执行 docker run -it centos -i 就变成执行 curl -s -i http://ip.cn

ENTRYPOINT

指定容器启动时 要执行的命令 跟CMD相比 不会最后一个生效 会是追加参数的状态

ONBUILD

当构建一个被继承的dockerfile时运行命令 父镜像在被子继承后夫进行的ONBUILD被触发 也就是 只要被继承了 就进行触发这里的命令 类似于触发器

docker 常用安装

一.安装 mysql

1.拉取mysql docker pull mysql:5.6 2.运行mysql docker run -p 1234:3306 --name zzsmysql -v /project/docker/mysql/conf:/etc/mysql/conf.d -v /project/docker/mysql/logs:/logs -v /project/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 3.进入mysql容器 操作mysql 4.外部链接的话 地址就是 宿主机的ip 密码是 刚才的密码123456 端口是刚才的端口1234 5.将容器内的数据库导出到宿主机 docker exec 容器id sh -C 'exec mysqldump --all-databases -uroot -p "123456"' > 宿主机目录 docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

关于 docker 的收集就到这里,后续还会再更新

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    494 引用 • 928 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...