# 更新数据源
apt-get update
# 安装所需依赖
apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# 安装 GPG 证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 新增数据源
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 更新并安装 Docker CE
apt-get update && apt-get install -y docker-ce
# 查看docker 安装的相关信息
docker version
官方中国区镜像地址:https://registry.docker-cn.com
阿里云镜像地址:https://902jf69q.mirror.aliyuncs.com/
注:可以在阿里云官网搜索自己的镜像地址。
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
# 重启 Docker
systemctl daemon-reload
systemctl restart docker
# 查看docker的安装信息
docker info
# 拉取镜像 其中除了软件名称意外其余都可以省略,参数可以通过docker pull --help 获取
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
# 查看都下载了那些镜像 如果镜像过多,可以通过在ls后面添加参数的方式来获取指定的镜像
docker image ls
# 查看nginx相关的镜像
docker image nginx
# 可以通过--format选项来查看指定的内容
docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
# 查看docker容器中镜像、容器、数据卷所占用的空间。
docker system df
# 删除镜像 镜像名称,镜像id都可以作为删除镜像的条件
docker image rm [选项] <镜像1> [<镜像2> ...]
# 查看docker中运行的容器
docker ps
# 运行一个docker容器
# -p 指定启动容器的端口号
# 前面的8080是宿主机端口:供外部(docker意外的程序)访问的端口。
# 后面的8080是容器端口:tomcat启动的端口,docker内部使用的端口。
# -d 指定启动方式,-d表示后台启动,不写表示前台启动,后台启动后得到容器的id
docker run -p 8080:8080 -d tomcat
# 运行容器
# run是docker启动容器的命令, 特点是如果本地存在,那么直接运行,如果不存在,则从镜像地址拉去一个相关的镜像,并运行
# ubuntu:15.10 镜像的名称:镜像版本
# /bin/echo "Hello world" 在容器内部要运行的命令
docker run ubuntu:15.10 /bin/echo "Hello world"
# 可以通过参数来进入运行的容器内部,可以使用exit命令来推出容器
# -t: 在新容器内指定一个伪终端或终端。
# -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
docker run -i -t ubuntu:15.10 /bin/bash
# 停止容器 一般会先运行docker ps 来查看对应的容器id和名称
docker stop [容器id/容器名称]
# 停止的容器恢复运行状态
docker restart [容器id/容器名称]
# 查看所有的容器,包括已经停止的
docker ps -a
# 删除容器 提示:无法删除正在运行的容器
# 如果需要停止正在运行的容器,需要加上-f参数
docker rm [容器id/容器名称]
# 不建议经常使用
docker rm -f [容器id/容器名称]
# 交互式进入容器,修改容器配置
# docker exec 进入正在运行的容器
# -it 表示使用linux提示符的方式操作容器
# 69d1 对应的容器id
# bash 表示进去容器中的位置
# 使用 ctrl+d退出容器,获取使用exit命令
docker exec -it 69d1 /bin/bash
以面向对象的方式来解释,就是类就是镜像,实例化的对象就是容器
由于拉去了新的镜像,旧的镜像名称和原有的镜像名称重复,因此,不在显示旧的镜像名称,统一使用
来显示旧的镜像名称。
需要镜像都是无用的镜像,可以删除
# 查看需要镜像的命令
docker image ls -f dangling=true
# 删除虚悬镜像
docker image prune
# 虚悬镜像的显示方式(不是命令,不能运行)
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 00285df0df87 5 days ago 342 MB
镜像可能会依赖一些底层镜像,这些镜像就是中间层镜像,如果删除,会导致顶层镜像不好用,不能随意删除。
中间层镜像的名称也是,不要误当做是虚悬镜像删除
# 查看中间层镜像
docker image ls -a
构建自己项目的镜像,以一个tomcat项目作为示例
vi Dockerfile
nano Dockerfile
FROM tomcat:latest
COPY index.jsp /usr/local/tomcat/webapps/ROOT
关于Dockerfile文件的内容的解释
第一行FORM tomcat:latest
:表示该镜像继承tomcat镜像,
第二行:表示操作,将indexl.jsp文件复制到指定的目录下
docker build -t myshop .
命令打包镜像参数说明:
build:docker的打包命令
-t myshop:指定打包的镜像名称和target
.(点) :表示当前目录有两层含义,一是表示Dockerfile的路径,二是表示Dockerfile的上下文目录并打包(参考下一个标题)
docker images
查看镜像是否存在docker run -p 8080:8080 --name myshop -d myshop
在docker build -t myshop .
命令中最后的.
表示的是Dockerfile文件的路径,也是打包的文件所在的路径,需要特殊说明的地方在于,docker的打包过程是将.
所在的目录打包到docker服务器之后再开始构建,就是说,如果在Dockerfile中操作了不属于.
目录下的文件,那么在构建镜像的时候就会报错。。
COPY: 复制文件到指定目录
# 安装docker
curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 安装完成后的项目需要做一次授权才能使用
chmod +x /usr/local/bin/docker-compose
也可以手动安装
在github中下载docker-compose文件后,上传到服务器后,移动到
/usr/local/bin
目录下,并改名为docker-compose就可以了,但是一样也需要授权chmod +x /usr/local/bin/docker-compose
通常在/usr/local
的目录下按装镜像
mkdir 文件夹
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
上面是docker-compose文件的示例文件,出了version和services之外其余的都是根据镜像的参数定制的,每个docker-compose文件可以安装和启动管理多个镜像。
yml文件编写的注意事项
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用 TAB 键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
# 启动(后台启动)
docker-compose up -d
# 关闭容器
docker-compose down
# tomcat安装部署
# TZ属性表示时区
# volumes 是将容器中的文件夹映射到本地,这个更方便部署
version: '3.1'
services:
tomcat:
restart: always
image: tomcat
container_name: tomcat
ports:
- 8080:8080
volumes:
- ./webapps:/usr/local/tomcat/webapps
environment:
TZ: Asia/Shanghai
# mysql的安装部署
# volumes是为了mysql数据的持久话,防止容器关闭后数据丢失
version: '3.1'
services:
db:
# 目前 latest 版本为 MySQL8.x
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
ports:
- 3306:3306
volumes:
- ./data:/var/lib/mysql
# 查看 Docker 版本
docker version
# 从 Docker 文件构建 Docker 映像
docker build -t image-name docker-file-location
# 运行 Docker 映像
docker run -d image-name
# 查看可用的 Docker 映像
docker images
# 查看最近的运行容器
docker ps -l
# 查看所有正在运行的容器
docker ps -a
# 停止运行容器
docker stop container_id
# 删除一个镜像
docker rmi image-name
# 删除所有镜像
docker rmi $(docker images -q)
# 强制删除所有镜像
docker rmi -f $(docker images -q)
# 删除所有虚悬镜像
docker rmi $(docker images -q -f dangling=true)
# 删除所有容器
docker rm $(docker ps -a -q)
# 进入 Docker 容器
docker exec -it container-id /bin/bash
# 查看所有数据卷
docker volume ls
# 删除指定数据卷
docker volume rm [volume_name]
# 删除所有未关联的数据卷
docker volume rm $(docker volume ls -qf dangling=true)
# 从主机复制文件到容器
docker cp host_path containerID:container_path
# 从容器复制文件到主机
docker cp containerID:container_path host_path