目录
1、docker是什么
docker可以理解为一个虚拟机。就相当于在你的电脑系统上又启动了一个系统。
2、docker中的一些概念
docker有镜像(images)和容器(container)的概念。
镜像,相当于模板,也可以理解为java中的类。
容器,镜像运行以后生成容器,就是镜像运行以后的实体,也可以理解为java中的对象。
3、镜像相关的命令
在dockerhub上搜索镜像,搜索mysql镜像
docker search mysql
获取镜像,从仓库上拉取镜像到本地
docker pull mysql:8.0
查看当前系统中的镜像
docker images
删除镜像,删除系统中存在的mysql8.0镜像
docker rmi mysql:8.0
强制删除镜像
docker rmi -f mysql:8.0
启动镜像
启动镜像使用docker run命令
docker run -d --restart=always --name mysql-service -v /mysql/data:/var/lib/mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=your_password mysql:8.0
-d 后台运行容器
--restart=always 代表自动重启
--name mysql-service 容器启动后的名称
-v /mysql/data:/var/lib/mysql 将本机的"/mysql/data"目录和容器内的"/var/lib/mysql"目录做映射
-p 3306:3306 将本机的3306端口和容器的3306端口映射
-e TZ=Asia/Shanghai 将容器的时区指定为上海,代表国内时间(一定要指定,不然时间为UTC时间)
-e MYSQL_ROOT_PASSWORD=your_password 你的数据库密码,默认用户为root
mysql:8.0 指定使用的镜像版本
执行镜像里命令
docker run -it ubuntu bash
-it 以命令行交互的模式执行 ubuntu镜像的 bash
打印hello docker!
docker run ubuntu echo 'hello docker!'
导入导出镜像,将mysql8.0镜像打包成mysql.docker存放在当前目录下
docker save mysql:8.0 -o mysql.docker
导入镜像到系统
docker load -i mysql.docker
查看镜像详情
docker inspect mysql:8.0
镜像重命名,打标签
docker tag mysql:8.0 mengmysql8.0
4、容器相关的命令
查看系统中的容器,正在运行的容器
docker ps
查看所有容器包括正在运行的容器
docker ps -a
查看正在运行的容器的id,只显示id
docker ps -q
查看所有容器id,只显示id
docker ps -a -q
删除容器,根据容器id,删除一个容器,不能删除正在运行的容器
docker rm e90f3dc1deca
强制删除容器,可以正在运行的容器
docker rm -f e90f3dc1deca
删除所有容器,包括正在运行的
docker rm -f $(docker ps -a -q)
查看容器log
docker logs e90f3dc1deca
持续查看容器log
docker logs -f a9ce4457add8
进入正在运行的容器中,以命令行交互模式执行容器里的sh,这样相当于ssh到容器里
docker exec -it a9ce4457add8 sh
查看容器详情
docker inspect a9ce4457add8
当前系统和容器相互复制文件,将某个容器中的varlogs目录复制到当前系统的logs中
docker cp a9ce4457add8:/varlogs /logs
将当前系统的demo目录复制到容器的根目录下
docker cp /home/demo a9ce4457add8
重启容器
docker restart a9ce4457add8
启动一个退出后的容器
docker start a9ce4457add8
退出一个容器,stop给容器发送退出命令,在规定时间内容器没有退出,就会执行强制退出
docker stop a9ce4457add8
强制容器退出,相当于执行了kill -9,杀掉进程
docker kill a9ce4457add8
容器生成镜像,将容器生成镜像,这里生成mengmysql的镜像
docker commit -a meng a9ce4457add8 mengmysql
-a 添加作者名称
5、制作镜像
方法一
将一个基础镜像启动成容器,在容器里安装需要的软件和服务,然后在生成镜像。
方法二
使用Dockerfile生成镜像
创建一个目录,在目录里新建一个Dockerfile文件。
文件内容如下:
# 基础镜像
FROM ubuntu
MAINTAINER wangmcn@163.com
# 参数
ARG api_url
# 设置环境变量
ENV JAVA_HOME jdk
# 创建 testdata目录,并挂载到主机中,通过 docker inspect 查看
VOLUME testdata
# 在主机中挂载多个目录
VOLUME [work,world]
# 将相对于Dockerfile文件的scr文件复制到镜像dist目录下
COPY src dist
# ADD 先解压文件,然后在复制到镜像中
ADD demo.tar demo
# 执行命令
RUN apt update &&
apt install nginx
# 暴露端口
EXPOSE 3306
# 切换工作目录
WORKDIR dir
# 随镜像启动一定执行
# ENTRYPOINT有两种启动方式
# Exec格式 ENTRYPOINT [binecho,hello world]
# Shell格式 ENTRYPOINT echo hello world
# Shell格式 会忽略CMD和docker run提供的参数
ENTRYPOINT [binecho, Hello]
# 跟随镜像启动执行,可以被启动参数覆盖掉
# 有三种格式
# Exec格式,CMD格式,Shell格式
# CMD格式 CMD [hello,world]
# CMD格式只能作为给ENTRYPOINT的Exec格式提供参数
CMD [world]
生成镜像,使用当前目录下的Dockerfile文件生成newbackstage镜像
docker build --build-arg api_url='httpstoad-api.creams.ioadmin' -t newbackstage .
--build-arg 给 Dockerfile中的ARG 传参数
指定Dockerfile文件,生成镜像
docker build --build-arg api_url='httpstoad-api.creams.ioadmin' -t newbackstage -f Dockerfile
6、docker中的网络
docker默认启动的容器都是通过docker0网桥和宿主机网络通信的
查看网络
docker network ls
创建一个网络,创建一个net-test网络
docker network create net-test
查看网络详情
docker network inspect net-test
启动容器指定网络,在不同网络中的docker容器不能通信
docker run -d -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 --net=net-test mysql8.0
--net 指定网络
用宿主机网络,进入容器查看ip地址,可以发现ip地址就为主机ip地址
docker run -d -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 --net=host mysql8.0
7、docker管理
docker version
dokcer info
docker system df
docker system prune -a -f
8、docker中安装并启动mysql
下载mysql镜像
docker pull mysql:8.0
启动镜像
docker run -d --restart=always --name mysql-service -v /mysql/data:/var/lib/mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=your_password mysql:8.0
查看启动的镜像,找到容器名称
docker ps
进入正在运行的容器中
docker exec -it cece66137605 bash
启动mysql
mysql -uroot -proot
精彩推荐