Docker基本操作
Docker环境配置
安装docker
参考https://www.jianshu.com/p/b7c9cfb06ea4
设置镜像源
/etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
启动docker
sudo systemctl start docker
设置开机自启
sudo systemctl enable docker
测试
docker run hello-world
Docker中央仓库
- Docker官方仓库,镜像最全,国内下载较慢
- 国内镜像,如网易云、DaoCloud(推荐)
https://c.163yun.com/hub#/home
- 在公司内部可以自行搭建中央仓库
自行搭建中央仓库方法
/etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["ip:port"]
}
最后需要重新启动下服务
sudo systemctl daemon-reload
sudo systemctl restart docker
镜像操作
拉取镜像到本地
# 命令
docker pull 镜像名[:tag]
# 例如
docker pull daocloud.io/library/tomcat:8.5.15-jre8
查看全部本地镜像
docker images
删除本地镜像
docker rmi 镜像的标志
# 这里 b8 是镜像的 id 开头几个字母
docker rmi b8
删除无用镜像
docker image prune
加上-a
参数后,会删除所有没有被容器引用的镜像
镜像的导入导出
# 将本地的镜像导出
docker save -o 导出的路径 镜像id
# 例如
docker save -o ./tomcat.image b8
# 加载本地的镜像文件(名称和版本为none,可以用下面的命令更改名字)
docker load -i 镜像文件
# 例如
docker load -i ./tomcat.image
# 镜像重命名
docker tag 镜像id 新名字:版本
# 例如
docker tag b8 tomcat:8.5
容器的操作
运行容器
docker run 镜像id|镜像名称[:tag]
常用参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像id|镜像名称[:tag]
# 例如
docker run -d -p 8081:8080 --name tomcat b8
- -d 后台运行容器
- -p 宿主机端口:容器端口 Linux端口和容器端口之间的映射
- --name 容器名称 指定容器名称
查看运行中的容器
docker ps [-qa]
-a 查看所有容器,包括没有运行的容器
-q 只查看运行中容器的标志
-qa 查看所有容器的标志
无参数 查看运行中的容器
查看日志
docker logs -f 容器id
- -f 动态查看日志的最后几行
进入容器内部
docker exec -it 容器id bash
# 退出
exit
删除容器
# 停止指定容器
docker stop 容器id
# 停止所有容器
docker stop $(docker ps -qa)
# 删除指定容器
docker rm 容器id
# 删除全部容器
docker rm $(docker ps -qa)
启动容器
docker start 容器id
Docker应用
mysql
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=my_secret daocloud.io/library/mysql:5.7.4
- -e 指定 mysql 密码
tomcat
docker run -d -p 8080:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8
部署项目
以部署Jenkins为例,下载地址http://updates.jenkins-ci.org/download/war/2.263/jenkins.war
# 将宿主机内容复制到容器
docker cp 文件名 容器id:容器内部路径
# 例如
docker cp jenkins.war db4914a734a2:/usr/local/tomcat/webapps/
访问ip:8080/jenkins
,可以看到jenkins已经安装好了,使用docker logs -f db4914a734a2
命令可以查看安装细节。
数据卷
将宿主机中的一个目录映射到容器的一个目录中,当宿主机目录发生变化时,容器中的目录也会跟着变化。数据卷实现了在容器外操作容器内的目录和文件
创建数据卷
# 创建数据卷
docker volume create 数据卷名称
# 默认数据卷位置是 /var/lib/docker/volumes/数据卷名称/_data
# 例如
docker volume create tomcat
查看数据卷详情
docker volume inspect 数据卷名称
# 例如
docker volume inspect tomcat
查看全部数据卷
docker volume ls
删除数据卷
docker volume rm 数据卷名称
# 例如
docker volume rm tomcat
删除无主数据卷
docker volume prune
应用数据卷
方式一:映射前创建数据卷
docker run -v 数据卷名称:容器内部路径 镜像id
# 创建数据卷
docker volume create volume_tomcat
# 将数据卷映射到容器内部目录
docker run -d -p 8080:8080 --name tomcat -v volume_tomcat:/usr/local/tomcat/webapps/ daocloud.io/library/tomcat:8.5.15-jre8
# 将项目复制到数据卷中
sudo cp jenkins.war /var/lib/docker/volumes/volume_tomcat/_data
采用create
方式创建的数据卷的挂载目录是/var/lib/docker/volumes/数据卷名称/_data
。所以上面的-v volume_tomcat:/usr/local/tomcat/webapps/
和-v /var/lib/docker/volumes/volume_tomcat/_data:/usr/local/tomcat/webapps/
是等价的。
方式二:指定数据卷目录(推荐)
docker run -v 路径:容器内部路径 镜像id
# 将指定目录数据卷映射到容器内部目录
docker run -d -p 8080:8080 --name tomcat -v /opt/volume_tomcat:/usr/local/tomcat/webapps/ daocloud.io/library/tomcat:8.5.15-jre8
# 将项目复制到数据卷中
sudo cp jenkins.war /opt/volume_tomcat
两种方式区别:第一种方式会在默认目录创建数据卷,而且容器中的内容也会拷贝到该目录中,第二种方式只在指定位置创建数据卷,但容器中内容不会自动拷贝进来
查看数据卷挂载位置
docker inspect 容器id | grep Mounts -A 20
Docker自定义镜像
创建Dockerfile
- FROM 指定当前自定义镜像依赖的环境
- COPY 将相对路径下的内容复制到自定义镜像中
- WORKDIR 声明镜像的默认工作目录
- ENV 配置环境变量
- RUN 创建当前的 Docker 镜像,每次调用该指令的时候,Docker 都会创建新的镜像层。RUN 后面直接跟 shell 指令
- CMD 需要执行的命令,在工作目录(workdir)下执行,可以写多个,只以最后一个为准
- MAINTAINER 镜像维护者信息
- EXPOSE 暴露端口
Dockerfile
FROM alpine:3.8
RUN apk add --no-cache \
ca-certificates \
git \
gcc \
musl-dev \
openssl \
go
ENV GOPATH /go
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
ENV APIPATH $GOPATH/src/api
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" "$APIPATH" && chmod -R 777 "$GOPATH"
WORKDIR $APIPATH
COPY . .
RUN \
go get -d -v \
&& go install -v \
&& go build
EXPOSE 3000
CMD ["./api"]
制作镜像
docker build -t 镜像名:[tag] 目录名
docker build -f Dockerfile -t 镜像名:[tag] 目录名
# 例如
docker build -t jenkins-tomcat:1.0.0 .
# 运行自定义镜像
docker run -d -p 8080:8080 --name jenkins-tomcat a75b8a0e7da6
dockerignore
在构建镜像过程中,为了提高构建性能,可以通过.dockerignore
文件排除上下文目录下不需要的文件和目录
.dockerignore
.DS_Store
node_modules
/dist
dist
Dockerfile
.dockerignore
# git
.git
.gitignore
# local env files
.env.local
.env.*.local
.env.production
.env
server/public
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
发布镜像
构建镜像
docker build -t your_dockerhub_username/your_image_name .
构建完成后,可以使用docker images
命令检查刚才构建的镜像
登录docker
docker login -u your_dockerhub_username
命令执行会要求输入密码,登录成功后会在~/.docker/config.json
存储用户登录信息
推送镜像
docker push your_dockerhub_username/your_image_name
取回镜像
docker pull your_dockerhub_username/your_image_name
Docker-Compose
之前运行一个容器,需要在命令行添加大量参数,这样不方便记忆和管理,Docker-Compose
可以用文件方式编写这些参数,而且它还可以批量管理容器
安装Docker-Compose
参考 https://www.jianshu.com/p/b7c9cfb06ea4
docker-compose.yml
docker-compose.yml
文件以key: value
来指定配置信息,多个配置信息以换行+缩进方式区分。键和值之间有一个空格,缩进用两个空格,不能使用制表符。推荐用Docker
插件进行格式化。
version: '3'
services:
mysql: # 服务的名称
restart: always # 只要 docker 启动,服务自动启动
image: daocloud.io/library/mysql:8.0.19 # 镜像位置
container_name: mysql # 容器的名称,通过 docker ps 查看
command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
ports:
- 3306:3306 # 指定端口映射,可以指定多对映射
environment: # 设置环境变量
MYSQL_ROOT_PASSWORD: screct # 指定 MYSQL root 用户登录密码
MYSQL_DATABASE: testdb # 初始化数据库
TZ: Asia/Shanghai # 指定时区
volumes:
- ./init:/docker-entrypoint-initdb.d # 初始化数据,容器创建时自动导入 MYSQL_DATABASE 指定数据库,注意数据源必须在数据卷首次挂载前存在
- /opt/docker_mysql/data:/var/lib/mysql # 映射数据卷
- /opt/docker_mysql/config:/etc/mysql/conf.d' # mysql 配置文件目录
mongo:
container_name: mongo
image: mongo:latest
restart: always
ports:
- '27017:27017'
volumes:
- /opt/docker_mongo/data/db:/data/db
redis:
container_name: redis
image: redis:alpine
restart: always
volumes:
- redis_data:/data
express-mongo-demo:
restart: always
build: # 构建自定义镜像
context: ./ # 指定 dockerfile 所在路径,这里是当前目录
dockerfile: Dockerfile # 指定 dockerfile 文件名
image: express-mongo-demo:1.0.1 # 指定镜像名字
container_name: express-mongo-demo # 指定容器名字
ports:
- 8080:8080
depends_on: # 镜像启动顺序
- redis
- mongo
volumes: # docker create volume 创建的容器需要在这里声明
redis_data:
启动并运行容器
运行
docker-compose
命令后,默认在当前目录下找docker-compose.yml
文件
docker-compose up -d
如果mysql启动失败,查看日志发现如下报错
mysqld: Can't create/write to file '/tmp/ibZhgm0t' (Errcode: 13 - Permission denied)
这是由于mysql没有/tmp
目录写入权限导致的,运行sudo chmod 777 /tmp
后重启服务
关闭并删除容器
docker-compose down
关闭容器同时删除数据卷
docker-compose down --volumes
docker-compose down -v
只会删除默认容器
开启|关闭|重启已存在容器
该容器必须是由docker-compose所管理的
docker-compose start|stop|restart
查看容器
docker-compose ps
查看日志
docker-compose logs -f
docker-compose管理自定义镜像
构建自定义镜像
Dockerfile
# 镜像依赖的环境
FROM node:10
# 容器中的工作目录
WORKDIR /usr/src/app
# 复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
COPY package*.json ./
# RUN 在 docker build 时运行
RUN npm install
COPY . .
# 声明端口,帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
EXPOSE 8080
# CMD 在 docker run 时运行,多个 CMD 仅最后一个有效。
CMD ["npm", "start"]
docker-compose.yml
version: '3'
services:
mongo:
container_name: mongo
image: mongo:latest
restart: always
ports:
- '27017:27017'
volumes:
- /opt/docker_mongo/data/db:/data/db
redis:
container_name: redis
image: redis:alpine
restart: always
volumes:
- /opt/docker_redis/data:/data
express-mongo-demo:
restart: always
build: # 构建自定义镜像
context: ./ # 指定 dockerfile 所在路径,这里是当前目录
dockerfile: Dockerfile # 指定 dockerfile 文件名
image: express-mongo-demo:1.0.1 # 指定镜像名字
container_name: express-mongo-demo # 指定容器名字
ports:
- 8080:8080
depends_on:
- redis
- mongo
运行自定义镜像
docker-compose up -d
如果自定义镜像不存在,会自动构建自定义镜像,如果自定义镜像已经存在,会直接运行这个镜像
重新构建自定义镜像
docker-compose build
运行前重新构建镜像
docker-compose up -d --build