Docker笔记
一、docker的下载安装
官网下载地址:https://docs.docker.com/engine/install/centos/。可以按照官网的步骤下载安装。以centos为例,大致如下:
1、安装yum-utils包(它提供yum-config-manager实用程序)并设置存储库。
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2、安装docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3、测试
docker -v
docker images
docker run hello-world
4、启动/停止docker
systemctl start docker
systemctl stop docker
5、配置镜像服务ACR
以阿里云为例,登录官网,产品–>容器–>容器镜像服务ACR–>镜像工具–>镜像加速器。按照提示执行指令。
二、docker基本命令
可以从官网:https://docs.docker.com/engine/reference/commandline 查看具体的使用方法。
1、从远程镜像仓库拉取镜像。登录官方镜像仓库:hub.docker.com,搜索自己想要的软件和版本号,复制下指令便可以执行。补充以下:pull下来的镜像默认存放在/var/lib/docker/image/overlay2/imagedb目录,容器存放在/var/lib/docker/containers目录。
#拉取镜像 docker pull [softName]:[version]
docker pull nginx:latest
docker pull dockette/jdk8
#构建(制作)镜像 docker build [OPTIONS] PATH | URL | -
docker build - < Dockerfile
docker build -t 'serviceName:1130' . #--tag或者-t指定名字和版本
#创建标签或修改镜像名称 docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
Docker tag imageId service:8088
#上传镜像到指定仓库 docker push [OPTIONS] NAME[:TAG]
docker imageID push registry-host:5000/myadmin/rhel-httpd:latest
#查看本地已存在镜像 docker images [OPTIONS] [REPOSITORY[:TAG]]
docker images
docker images java #过滤镜像名称为java的镜像
docker history [image] #查看镜像历史
#删除镜像 docker rmi [OPTIONS] IMAGE [IMAGE...] 带-f可以强制删除正在运行的镜像
docker rmi fd484f19954f
docker rmi nginx:latest
#保存镜像(Save one or more images to a tar archive) docker save [OPTIONS] IMAGE [IMAGE...]
docker save -o nginx.tar nginx:latest #-o指定输出为tar包
#加载镜像(Load an image from a tar archive or STDIN) docker load [OPTIONS]
docker load -i nginx.tar #-i指定加载的输入
2、从镜像中创建运行新容器,启动/停止容器,查看正在运行的容器,删除容器。查看容器日志。
#从镜像中创建运行新容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
#-d后台运行; -p [主机端口]:[容器端口]/[tcp或者udp或者sctp] 将容器端口绑定到指定主机端口;--name设置容器名称
docker run -d -p 127.0.0.1:80:8080/tcp --name nginx01 nginx:latest
#查看正在运行的容器
docker ps #显示容器(默认只显示正在运行的)
docker ps -a #显示所有容器(包括没有运行的)
docker ps -size #显示占用磁盘大小(size--写入层已使用大小,virtual size--只读镜像和写入层已使用总大小)
docker ps --filter "name=nginx" #显示过滤容器名称包含nginx的容器
docker ps --format "table{{.ID}}\t{{.Image}}" #显示部分选线
#启动容器 docker start [OPTIONS] CONTAINER [CONTAINER...]
docker start 1c29786212dc #重新启动容器进程
#停止容器 docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker stop 1c29786212dc #容器还在,只是停止容器进程
#删除容器 docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker rm -f 413831fdca2f #删除容器 -f为强制删除正在运行的容器
docker ps --filter status=exited -q | xargs docker rm 或者 docker rm $(docker ps --filter status=exited -q) #删除所有不在运行的容器
#查看容器日志
docker logs e4acfa0e888c
#查看容器详情 docker inspect [OPTIONS] NAME|ID [NAME|ID...]
docker inspect nginx01
3、进入容器,在容器执行指令。
#进入容器,执行操作
docker exec e4acfa0e888c pwd #进入docker容器并执行一条指令
docker exec -it e4acfa0e888c sh #连接docker容器并打开一个shell操作窗口,然后可以类似和在主机系统上执行Linux命令一样,结束exit退出
4、数据卷。
数据卷是一个虚拟目录,用来标记容器内目录和宿主机目录之间的双向映射。这是由于docker容器都是按最小化打包的,可能不包含ll,vi这些指令。如果通过数据卷可以在宿主机修改容器内目录,同时容器内的数据也可以同步在宿主机,比如mysql数据库的存放目录。
已经存在的容器无法在挂载数据卷,所以要通过docker run命令重新创建带有数据卷挂在的容器。
#-v增加数据卷 [数据卷]:[容器目录] 默认路径:/var/lib/docker/volumes
docker run -d -p 127.0.0.1:82:8080 -v html:/usr/share/nginx/html --name nginx03 nginx:latest
#-v增加数据卷 [宿主机目录]:[容器目录]
docker run -d -p 127.0.0.1:83:8080 -v /usr/src/dockerTest/nginx04:/usr/share/nginx/html --name nginx04 nginx:latest
#查看数据卷列表
docker volume ls
#数据卷详情 docker volume inspect [OPTIONS] VOLUME [VOLUME...]
docker volume inspect html
5、网络。
docker容器创建后会以bridge(桥接)方式连接到docker的一个虚拟网桥上。同一虚拟网桥是互通的,可以通过ping容器名验证。
#查看docker虚拟网桥列表
docker network ls
#创建网桥 docker network create [OPTIONS] NETWORK
docker network create dockerNet01
#加入网桥 docker network connect [OPTIONS] NETWORK CONTAINER
docker network connect dockerNet01 nginx04
docker run --network dockerNet01 #也可以在运行容器时指定加入的网桥
#查看网桥详情 docker network inspect [OPTIONS] NETWORK [NETWORK...]
docker network inspect dockerNet01
三、自定义镜像
3.1、可以通过dockerfile自定义镜像。
实践例子如下:
3.1.1 使用Dockerfile制作java程序镜像
#指定基础镜像。可以从远程仓库下载也可以使用本地保存的jdk镜像。表示基于dockette/jdk8镜像构建。
FROM dockette/jdk8
#制作者名称或信息
MAINTAINER serviceName
#指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在则会创建目录
WORKDIR /app/serviceName/
#复制jar包(其实就是在jar包所在目录下启动容器)到指定工作目录
COPY serviceName-1.0.0.RELEASE.jar /app/serviceName/
#映射到宿主机的端口
EXPOSE 8098
#容器启动时需要执行的命令
CMD ["java","-jar","/app/serviceName/serviceName-1.0.0.RELEASE.jar","-Dfile.encoding=utf-8"]
#RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
然后使用build命令打包镜像:docker build -t=‘serviceName:01’(镜像名称:版本号) .
(需要注意指令后面的. 表示从当前目录找Dockerfile文件)。
启动部署容器:docker run -id --name containName(容器名称) --net=host -e JAVA_OPTS=‘-Duser.timezone=GMT+08’ -v /data/serviceName/(映射路径):/app/serviceName/ imageName:1130(镜像名称和版本号)
比如:docker run -it --privileged=true --restart=always --name deliver --net=host -e TZ=“Asia/Shanghai” -e spring.profiles.active=pro -e spring.application.name=deliver -v /appdata/xxx/deliver:/app/deliver -d deliver
四、实践
4.1、使用redis-cli连接redis
#1、使用inspect命令找到HostConfig-->Binds;找到对应的配置文件映射路径
docker inspect redis
#2、通过映射配置文件找到启动密码
cat /home/redis/redis.conf | grep "requirepass" -C 3
#3、使用exec指令进入容器通过redis-cli连接
docker exec -it redis redis-cli -h 127.0.0.1 -p 6379 -a password