docker使用
安装
1 2
| apt-get update apt-get install -y docker.io
|
配置镜像源
阿里云镜像加速
1 2 3 4 5 6 7
| vim /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] }
service docker restart
|
镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| docker version
查看本地主机上的镜像 docker image ls || docker images
同一仓库源可以有多个 TAG REPOSITORY:TAG 来定义不同的镜像 不指定一个镜像的版本标签,将默认使用 ubuntu:latest 镜像
docker pull REPOSITORY:TAG 获取一个新的镜像
docker search REPOSITORY 查找镜像
镜像别名 docker image tag REPOSITORY:TAG newImage:v1 docker tag 原镜像名称:TAG 新镜像:TAG
删除镜像 docker rmi REPOSITORY:TAG docker image rm REPOSITORY:TAG docker image rm IMAGE-ID
docker run REPOSITORY:TAG
创建镜像:(构建镜像) docker build
更新镜像: 更新镜像之前,我们需要使用镜像来创建一个容器 1.从已经创建的容器中更新镜像,并且提交这个镜像 2.使用 Dockerfile 指令来创建一个新的镜像
|
容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| 容器运行 docker run -d
-it /bin/bash 进入容器
-p 端口映射 -d:表明容器的运行模式在后台 dist-docker 镜像名 docker run
容器停止 docker stop `CONTAINER ID` docker kill
启动 docker start CONTAINER ID
docker stats 查看CPU
容器删除 docker rm `CONTAINER ID` dcoker rm `docker ps -a -q` 删除所有容器
深入容器 docker inspect `CONTAINER ID`
获取容器IP docker inspect 5003a6cecaf1 | grep IPAddress
端口映射 docker run -p 2333:80
挂存储卷()
查询容器 docker ps || docker container ls 运行中的 docker ps -a || docker container ls
进入容器 docker exec -it 容器ID /bin/bash
docker attach 容器ID
退出容器 exit
查看容器日志 docker logs -f 容器ID
容器ID映射的宿主机端口 docker port containerID 80
设置环境变量
docker container ls || docker ps 查看当前运行的容器
将容器内容拷贝至主机 docker cp containerID:/home/demo.html /Users/afacode/private/
docker run 参数 -d
-p -v 数据挂载 -e 配置环境
多个容器数据卷相互共享,实际是备份
docker run -d -p 3307:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw
docker run -d -p 3307:3306
多个MySQL或者Redis实现数据共享
容器之间配置信息的相互传递,数据卷生命周期一直持续到没有人使用容器为止
|
容器数据卷
- 容器内产生的数据,同步到本地。需要数据共享。将容器内目录挂载到本地
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| docker run -v -v 主机目录:容器内目录
docker run -it -v /home/test:/home centos /bin/bash 容器内/home目录会同步到本机/home/test 反之同理 双向绑定
多个容器数据卷相互共享,实际是备份 --volumes-from mysql01
docker run -d -p 3307:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw --name mysql01 mysql:5.7
docker run -d -p 3307:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=my-secret-pw --name mysql01 mysql:5.7
多个MySQL或者Redis实现数据共享
容器之间配置信息的相互传递,数据卷生命周期一直持续到没有人使用容器为止
|
MySQL数据持久化
1 2 3 4 5
| docker pull mysql:5.7
docker images
docker run -d -p 3307:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw --name mysql-demo mysql:5.7
|
具名挂载和匿名挂载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| 匿名挂载 是只指定容器内路径,没有指定本机路径
docker run -d -v
查看所有卷 docker volume ls 这种事匿名挂载 local 6ae0f43ce8eab7c422d4f83cebbbb3e2b801bdcacea7fb1aaabc59fb5296a96c
具名挂载 docker run -d -v juming-nginx:/etc/nginx nginx:latest
查看卷 docker volume inspect VOLUME-NAME
[ { "CreatedAt": "2020-07-13T03:12:37Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/6ae0f43ce8eab7c422d4f83cebbbb3e2b801bdcacea7fb1aaabc59fb5296a96c/_data", "Name": "6ae0f43ce8eab7c422d4f83cebbbb3e2b801bdcacea7fb1aaabc59fb5296a96c", "Options": null, "Scope": "local" } ]
所有没有指定卷的路径时,都是在 /var/lib/docker/volumes_data
如何确定是 具名挂载,匿名挂载还是指定路径挂载
-v 容器内路径 匿名挂载 -v 卷名:容器内路径 具名挂载 -v 本机路径:容器内路径 指定路径挂载
拓展 读写权限 ro readonly 只读 路径内文件只能通过本机操作,不能通过容器内操作 rw readwrite
docker run -d -v juming-nginx:/etc/nginx:ro nginx:latest
docker run -d -v juming-nginx:/etc/nginx:rw nginx:latest
|
网络
自定义镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| 镜像构建 1. docker commit docker commit containerID afacode/newImage docker commit -m="A new image" --author="afacode <afacode@outlook.com>" containerID afacode/newImage:Tag
2. docker build
docker build -t hello-docker:1.0.0 ./ --no-cache
docker build -t hello-docker:1.0.0 -f /var/test/Dockerfile
-t 参数用来指定镜像的文件名称镜像的名字hello-docker,版本号1.0.0, ./ 找当前目录的Dockerfile --no-cache 不使用缓存 镜像构建过程中会按照Dockerfile的顺序依次执行,每执行一次指令 Docker 会寻找是否有存在的镜像缓存可复用,如果没有则创建新的镜像。如果不想使用缓存,则可以在docker build时添加--no-cache=true选项。
构建历史 docker history imageID
镜像打TAG docker tag 为本地镜像打标签,tag 不写默认为 latest docker image tag [imageName] [username]/[repository]:[tag] docker tag hello-docker afacode/hello-docker
镜像推送 docker push docker image push [username]/[repository]:[tag] docker push afacode/hello-docker
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| FROM FROM <image> FROM <image>:<tag> FROM <image>@<digest>
MAINTAINER MAINTAINER afacode MAINTAINER afacode@outlook.com MAINTAINER afacode <afacode@outlook.com>
WORKDIR 通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
RUN RUN <command>
ADD
COPY
CMD CMD echo "This is a test."
ENTRYPOINT 在容器启动时才进行调用 可以追加命令
ONBUILD
ENV
EXPOSE EXPOSE 80 443 EXPOSE 8080
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能: 1 卷可以容器间共享和重用 2 容器并不一定要和其它容器共享卷 3 修改卷后会立即生效 4 对卷的修改不会对镜像产生影响 5 卷会一直存在,直到没有任何容器在使用它 VOLUME VOLUME ["/data"] VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
|
练习Demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| mkdir hello-docker 1. 创建文件 touch inde.html <h1>Hello docker</h1>
创建一个Dockerfile文件 FROM nginx COPY ./index.html /usr/share/nginx/html/index.html EXPOSE 80
2. 打包镜像 cd hello-docker/ # 进入刚刚的目录 docker image build ./ -t hello-docker:1.0.0 # 打包镜像 基于路径./(当前路径)打包一个镜像,镜像的名字是hello-docker,版本号是1.0.0。该命令会自动寻找Dockerfile来打包出一个镜像
3. 运行容器 docker container create -p 2333:80 hello-docker:1.0.0 docker container start xxx # xxx 为上一条命令运行得到的结果
4. 预览 浏览器打开127.0.0.1:2333,你应该能看到刚刚自己写的index.html内容
5 查看当前运行的容器 docker container ls || docker ps
6. 进入容器内部 docker container exec -it xxx /bin/bash # xxx 为容器ID
|
如有问题可联系 Email:afacode@outlook.com 或 微信:afacode