1.参考资料
官方文档:https://docs.docker.com/docker-for-windows/ 仓库地址:https://hub.docker.com/
2.Docker 的安装
2.1.docker的组成部分
-
**镜像(image):**docker镜像好比一个模板,可以通过这个模板来创建容器(container),一个镜像可以创建多个容器,类似java中的Class -
容器(container):类似java中通过Class创建的实例;容器可以理解为一个简易的linux系统 -
**仓库(repository):**存放镜像的地方, 分为共有仓库和私有仓库
-
Docker Hub:国外的 -
阿里云:配置镜像加速
2.2.环境准备
我们要有一台服务器,并且可以操作它
-
Linux命令基础 -
CentOS 7 -
使用Xshell链接远程服务器(免费版即可)
2.3. 安装docker
https://docs.docker.com/engine/install/centos/ 卸载旧的版本
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装基本的安装包
$ sudo yum install -y yum-utils
设置镜像的仓库
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的
$ sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 阿里云镜像
安装docker引擎
yum makecache fast
安装docker引擎
yum install docker-ce docker-ce-cli containerd.io
CentOS 8中安装Docker出现和Podman冲突
yum erase podman buildah
继续执行安装即可
2.4.启动docker
systemctl start docker # 代表启动成功
docker version
docker run hello-world
docker images
2.5.卸载Docker
# 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
# 删除资源
rm -rf /var/lib/docker # docker 的默认工作路径
3.docker 常用命令
以上已经用到了一些相关命名下面整体介绍一下。
命令参考地址:
https://docs.docker.com/engine/reference/commandline/docker/
3.1. 全局命令
docker version # 显示docker的基本信息
docker info # 系统信息,镜像和容器的数量
docker 命令 --help # 全部信息
3.2.镜像命令
3.2.1.docker images
docker images # 查看所有本地主机上的镜像
--all , -a Show all images (default hides intermediate images) # 显示所有
--digests Show digests
--filter , -f Filter output based on conditions provided
--format Pretty-print images using a Go template
--no-trunc Don’t truncate output
--quiet , -q Only show numeric IDs # 只显示id
3.2.2. docker search
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
3.2.3.docker pull
docker pull mysql
# 指定版本下载
docker pull mysql:5.7
分层下载的好处是:不同的版本相同的部分不用重新下载。
3.2.4. docker rmi
# 删除一个 可以通过名称 也可以指定id -f表示删除所有
docker rmi -f d1165f221234
# 删除多个 用空格分隔id
docker rmi -f id id id
# 删除所有
docker rmi -f $(docker images -aq) # images -aq就是查所有镜像id,从而递归删除
3.2.容器命令
有了镜像才能创建容器,linux,下载一个centos镜像来测试学习
3.2.1.新建容器并启动
docker run [可选参数] image
3.2.2.进入容器
docker exec -it 1de87c606832 /bin/bash
# docker attach 1de87c606832
区别 docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用) docker attach 进入容器正在执行的终端,不会启动新的进程
ls
3.2.3.查看容器
docker ps
docker ps -a
docker ps -a - n=?
docker ps -aq
3.2.4.退出容器
exit
Ctrl + P + Q
3.2.5.删除容器
docker rm 容器id
docker rm -f $(docker ps -aq)
docker ps -a -q|xargs docker rm
3.2.6.导入导出
docker export $CONTAINER_ID > ubuntu.tar
$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1
3.2.7.自动重启
docker run --restart=always 容器id(或者容器名称)
docker update --restart=always 容器id(或者容器名称)
3.2.8.相关状态
docker start $CONTAINER_ID
docker restart $CONTAINER_ID
docker stop $CONTAINER_ID
docker kill $CONTAINER_ID
3.3.常用其他命令
3.3.1.后台启动docker
docker run -d 镜像名
3.3.2.查看日志
docker logs
docker logs -f --tail=20 $CONTAINER_ID
3.3.3.查看容器信息
docker inspect $CONTAINER_ID
3.3.4.文件copy
容器copy 到主机
docker cp $CONTAINER_ID:路径 空格 主机路径
docker cp 83b0be074d94:/etc/mysql /home
主机copy 到容器
docker cp 主机路径 空格 $CONTAINER_ID:路径
后面我们会遇到 卷
### 3.3.5.任务管理器
docker stats
4.容器数据卷
在Docker中,要想实现数据的持久化,数据就不应该在容器中,否则容器删除,数据就会丢失。故容器之间要有一个数据共享技术,把Docker容器中产生的数据,同步到本地,这就是卷技术。
优点
-
容器的持久化和同步操作 -
容器间可以数据共享
4.1.使用数据卷
目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:
(1)volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)
(2)bind mounts:意为着可以存储在宿主机系统的任意位置;(比较常用的方式)
但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。
(3)tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式)
4.1.1.命令挂载
docker run -it -v -p /宿主机绝对路径:/容器内目录:权限 镜像名
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置 安装启动mysql需要配置密码
--name 容器名字
主机目录/home/mysql/conf与/etc/mysql/conf容器目录同步。
查看其信息
soruce:主机地址
destination:容器地址
4.1.2.匿名与具名挂载
匿名挂载:卷挂载只写容器里面的路径,不写容器外的路径。
docker run -d -P --name nginx01 -v /etc/nginx nginx
**具名挂载:**就是挂载的卷陪一个自己的名字,可以方便的查找
docker run -d -P --name nginx01 -v wyl-nginx:/etc/nginx nginx
docker inspect 6d4a76d84a35
4.1.3.查看卷信息
docker volume inspect wyl-nginx
4.1.4.改变文件的读写权限
docker run -d -P --name nginx01 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v nginxconfig:/etc/nginx:rw nginx
4.2.查看所有的数据卷
docker volume ls
4.3.共享卷
docker run -it --name nginx03 --volumes-from nginx02 nginx:latest
nginx03继承nginx02的volumes
可以验证,在nginx02下加一个数据,在nginx03下也会出现
删除容器共享文件不会删除。
5.dockerFile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
5.1.命令
FROM # 基础镜像 比如centos
MAINTAINER # 镜像是谁写的 姓名+邮箱
RUN # 镜像构建时需要运行的命令
ADD # 添加,比如添加一个tomcat压缩包
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 指定暴露端口,跟-p一个道理
RUN # 最终要运行的
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,而且可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承Dockerfile 这个时候运行ONBUILD指定,触发指令
COPY # 将文件拷贝到镜像中
ENV # 构建的时候设置环境变量
5.2.创建centos
5.2.1.创建dockerfile
cd /home
mkdir dockerfile
cd dockerfile/
vim mydockerfile-centos
FROM centos
MAINTAINER wyl<1714404171@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 8088
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
5.2.2.docker build
cd /home/docerfile
docker build -t mycentos -f mydockerfile-centos .
后面的点不要忘记
6.Docker Compose
前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知.对此我们就可以来学习一下docker compose
它是一个用于定义和运行多容器 Docker 的应用程序工具
6.1. compose安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
or
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
pip安装
sudo pip install docker-compose
6.2.权限
sudo chmod +x /usr/local/bin/docker-compose
6.3.Compose 使用
三个步骤:
-
使用 Dockerfile 定义应用程序的环境。 FROM java:8
VOLUME /tmp
ADD docker-demo.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
-
使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。 Compose和Docker兼容性:
Compose 文件格式有3个版本,分别为1, 2.x 和 3.x
目前主流的为 3.x 其支持 docker 1.13.0 及其以上的版本
常用参数:
version
services
build
context
dockerfile
args
cache_from
labels
shm_size
command
configs
cgroup_parent
container_name
credential_spec
deploy
endpoint_mode
vip
dnsrr
labels
mode
global
replicated
placement
replicas
resources
limits
cpus: "0.5"
memory: 50M
reservations
cpus: "0.2"
memory: 20M
restart_policy
condition
none
on-failure
any
delay
max_attempts
window
update_config
parallelism
delay
failure_action
continue
rollback
pause
monitor
max_failure_ratio
order
stop-first
start-first
rollback_config
parallelism
delay
failure_action
continue
pause
monitor
max_failure_ratio
order
stop-first
start-first
注意:
支持 docker-compose up 和 docker-compose run 但不支持 docker stack deploy 的子选项
security_opt container_name devices tmpfs stop_signal links cgroup_parent
network_mode external_links restart build userns_mode sysctls
devices
depends_on
-
最后,执行 docker-compose up 命令来启动并运行整个应用程序。 docker-compose up
docker-compose up -d // 后台启动并运行容器
6.3.卸载
pip uninstall docker-compose
6.4.常用命令
|