# centos 7
systemctl start docker # 启动服务
systemctl stop docker
systemctl restart docker # 重启服务
systemctl status docker
systemctl enable docker # 开机自启动
# 查看镜像
docker images
docker images -q # 查看所有的镜像ID
# 搜索镜像
docker search redis #可以直接去官网查看docker官方支持的镜像 hub.docker.com
# 拉取镜像
docker pull redis[: 版本号]
# 删除镜像
docker rmi IMAGEID
# 查看容器
docker ps -a # -a:查看所有的容器包括历史的
# 创建并启动容器
# -i:容器一直运行 -t:分配一个伪终端 --name:起名字
docker run -i -t --name=c1 image:版本 /bin/bash # 交互式容器
# -d:后台运行容器
docker run -i -d --name=c2 image:版本 # 守护式容器
# 退出容器 利用-it创建的容器exit后容器会立刻关闭
exit
# 进入容器
docker exec -i -t 容器名 /bin/bash
# 停止容器
docker stop 容器名
# 启动容器
docker start 容器名
# 删除容器(不能删除运行的容器)
docker rm 容器名
# 查看容器信息
docker inspect 容器名
Docker容器删除后,容器中产生的数据就不在了
Docker容器不可以和外部机器直接交换文件
容器之间的怎么数据交互? —>数据卷
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定之后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器可以挂在多个数据卷
数据卷的作用
- 容器数据的持久化
- 外部机器和容器的间接通信
- 容器之间的数据交换
创建容器时,使用-v
设置数据卷
docker run ... -v 宿主机目录:容器内目录 [-v 宿主机目录:容器内目录]
注意:
通过多个容器挂载相同的数据卷,可以实现容器之间的数据交互
docker run -it --name=c3 -v /root/data:/root/data centos:7
docker run -it --name=c4 -v /root/data:/root/data centos:7
# 容器中在挂在的目录修改添加文件后,两个容器的数据是同步的
echo hhhh>a.txt
创建启动c3数据卷容器,使用-v
参数设置数据卷
docker run -it --name=c3 -v /volume centos:7
-v /volume 没有指定宿主机的数据卷目录,docker会自动分配一个目录,可使用docker inspect c3查看
创建启动c1 c2容器,使用–-volumes-from
挂载到容器c3
docker run -it --name=c1 --volumes-from c3 centos:7
docker run -it --name=c2 --volumes-from c3 centos:7
此时c1 和c2 挂载到了c3上,c3挂载到了宿主机上,本质上是c1、c2、c3都挂载到了宿主机的同一个位置
问题:
- 容器内的网络服务和外部机器是不能直接通信的
- 外部机器和宿主机可以直接通信
- 容器和宿主机可以直接通信
解决方式:端口映射
当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器就可以通过访问宿主机的端口,从而访问容器的服务
步骤:
搜索镜像
docker search mysql
拉取镜像
docker pull mysql:5.6
创建容器、设置端口映射、目录映射(数据卷)
#先在宿主机/root目录下创建一个mysql目录,用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql/
创建端口映射、数据卷
docker run -id \ # 以后台运行的方式创建容器
-p 3307:3306 \ # 端口映射 宿主端口:容器服务端口
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \ # 必要的数据卷设置
-v $PWD/logs:/logs \ # 同上
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \ # 初始化root用户的密码
mysql:5.6 # 镜像以及版本的选择
进入容器
docker exec -it c_mysql /bin/bash
进入容器后就可以直接登录mysql,并进行mysql的相应操作了
此时可以在外部主机通过映射的端口访问到容器内了
操作容器
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
在宿主机器上创建HTML网页,例如创建在$PWD/test/index.html
浏览器访问:http://192.168.148.129:8080/test/index.html
docker run -id --name=c_redis -p 6379:6379 redis:5.0
镜像原理
- Docker镜像是由特殊的文件系统叠加而成
- 最底端是bootfs,使用宿主机的bootfs
- 第二层是root文件系统rootfs,称为base image
- 之后往上边叠加替他的镜像文件
- 统一文件系统技术将不同的层整合成一个文件系统,为这些层提供一个统一的视角,这样来隐藏多层的存在,在用户看来,,只存在一个文件系统
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像是基础镜像
- 镜像是只读的,但是Docker可以加载一个可读写的文件系统作为容器,再整成新的镜像
# 将一个容器转化为镜像
docker commit 容器id 镜像名称:版本号
# 镜像无法传输,因此需要将镜像转化为压缩文件以便于传输
docker save -o 压缩文件名称 镜像名称:版本号
# 将压缩文件解压为镜像
docker load -i 压缩文件名称
Dockerfile
制作书写Dockerfile可以优先抄写官网上的写法
Dockerfile关键字 关键字指南
写好Dockerfile文件
使用 docker bulid 命令 构建镜像,然后镜像被压缩后就可以传输给别的使用者
docker build -f dockerfile文件路径 -t 镜像名称:版本 .
自定义一个centos7镜像,要求:
- 默认登录路径为 :
/usr
- 可以使用
vim
Dockerfile文件如下:
# dockerfile 注意dockerfile中需要的镜像资源,本机如果有就会使用本机的
# 若本机没有会自动下载
FROM centos:7
MAINTAINER dzc<12345@qq.com>
RUN yum install -y vim
WORKDIR /usr
CMD /bin/bash
#docker bulid 构建镜像
# -f docker文件路径
# -t 镜像名称:版本号
# .搜索路径
docker build -f ./centos_dockerfile -t centos_with_vim:1.0 .
docker build
最后的.
号,其实是在指定镜像构建过程中的上下文环境的目录
# 由镜像创建并启动容器,即可进入
docker run -it --name=centos_vim centos_with_vim:1.0
在
docker-compose.yml
文件中定义各个容器之间的关系、启动顺序等
docker-compose
安装# 二进制包的方式安装到linux中(命令多试几次就行了)
curl -L https://github.com/docker/compose/release/download/1.22.0/docker-compose-`uname-s`-`uname-m` -o /usr/local/bin/docker-compose
# 设置文件的可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose --version
# 查看有啥镜像
docker iamges
>>---------------------------虚线下为终端输出
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_with_vim 1.0 087e14c3fff7 About an hour ago 477MB
nginx latest 605c77e624dd 19 months ago 141MB
tomcat latest fb5657adc892 19 months ago 680MB
redis 5.0 c5da061a611a 19 months ago 110MB
mysql 5.6 dd3b2a5dcb48 19 months ago 303MB
registry latest b8604a3fe854 20 months ago 26.2MB
centos 7 eeb6ee3f44bd 22 months ago 204MB
# 打标签(勿忘端口号)
docker tag centos_with_vim:1.0 192.168.148.129:5000/centos_vim
# 再查看下镜像
docker iamges
>>---------------------------虚线下为终端输出
REPOSITORY TAG IMAGE ID CREATED SIZE
centos_with_vim 1.0 087e14c3fff7 About an hour ago 477MB
192.168.148.129:5000/centos_vim latest 087e14c3fff7 About an hour ago 477MB
nginx latest 605c77e624dd 19 months ago 141MB
tomcat latest fb5657adc892 19 months ago 680MB
redis 5.0 c5da061a611a 19 months ago 110MB
mysql 5.6 dd3b2a5dcb48 19 months ago 303MB
registry latest b8604a3fe854 20 months ago 26.2MB
centos 7 eeb6ee3f44bd 22 months ago 204MB
docker push 192.168.148.129:5000/centos_vim
>>>----------------------------------------
Using default tag: latest
The push refers to repository [192.168.148.129:5000/centos_vim]
5f70bf18a086: Pushed
e125f7c01fa0: Pushed
174f56854903: Pushed
latest: digest: sha256:eadf3fbeaabf26be9b490a31dcd395899a2025deee37fa5be0045a7df30f7a39 size: 947
# 192.168.148.129:5000/centos_vim 分别是私有仓库的地址和端口以及其镜像的名称
docker pull 192.168.148.129:5000/centos_vim
如果本文对您有用,可以点赞、收藏本文哦,下次用到时就好找多了
如果能关注作者就太好了,作者将持续学习,持续输出,持续分享!谢谢鼓励!