2. 应用场景
3. Docker引擎
4. Docker系统架构
5. Docker安装
或直接:sudo apt-get install -y docker.io
ExecStart=/usr/bin/dockerd --registry-mirror=https://jxus37ac.mirror.aliyuncs.com
d . 重启docker 服务
6. 第一个Docker应用程序
docker run ubuntu:15.10 /bin/echo "hello Docker"
从网上下载ubuntu15.10 的镜像,创建一个容器 ,使用容器打印 “hello docker" 运行完毕就会释放
docker images
查看所有的镜像
docker ps
查看启动中的容器, -a 参数 查看所有的,包括结束的
docker rm containerID
删除容器,id很长,通常情况下只适用前n位也可 rmi 可删除镜像
docker run -it ubuntu:15.10 /bin/bash
占用主线程的交互式容器,即可进入Ubuntu容器 root命令行
docker run -d ubuntu:15.10 /bin/bash -c "while true:do echo hello docker;sleep 1;done"
后台运行 -d表示在后台
docker logs containerId
查看容器日志,加参数 -f可动态查看
docker stop containerId
停止容器
docker exec -it containerId /bin/bash
适用bash与正在运行的容器进行交互
7. Docker客户端
docker COMMAND --help
8. 运行web容器
docker run -d -P training/webapp python app.py
在一个完整的操作系统上运行python程序 -P:表示把容器的端口映射到宿主机,宿主机随机一个端口映射到容器 docker ps 查看 镜像为training/webapp 它是一个flask程序 运行命令python app.py
可以将自己写的java等打包成容器
docker run -d -p 4000:5000 training/webapp python app.py
-p:可以指定访问端口 宿主机4000,容器5000
docker top containerId docker top names
查看容器中的进程
docker inspect
查看容器状态:json字符格式
docker 安装后会产生一个虚拟网卡,mac等,容器产生的Ip都是基于虚拟网卡的
docker tag containerId imageName:newTag
出现一个新的image,与上个同名,tag不同, 设置镜像标签
docker rm containerId1 containerId2
同时移除多个容器
9. Docker镜像管理
若使用的镜像不存在会从 Docker Hub 下载
docker pull tomcat
docker pull tomcat:8.5.49-jdk11-openjdk
获取镜像,默认获取最新版本,也可以指定版本获取
docker search tomcat
查找镜像,一般选择官方的,使用docker pull name 获取, starts 表示的是使用量,可作为评价标准
从已经创建的容器中更新镜像,并且提交这个镜像
交互式运行ubuntu,进入bash
apt-get update
退出容器,此时若不提交,以上的操作下次生成容器时会重置
docker commit -m="has update" -a="userName" containerId newImageName:Tag(随便)
修改源镜像------》提交为一个新的镜像
使用DockerFile指令来创建镜像
mkdir myUbuntu
cd myUbuntu
vi Dockerfile #(名字不要更改)
FROM ubuntu:15.10 # 系统
MAINTAINER your-email
COPY test.txt /home # 将宿主机的文件test.txt copy 到镜像的home下
RUN /bin/bash -c "Hello world" # 指定镜像默认执行的命令
CMD ["/bin/echo","this is param1"] # 文件中只能有一个cmd,有多个会只执行第一个
WORKDIR /home # 指定默认的工作目录
EXPOSE 80 # 暴露端口
EXPOSE 8080
docker build -t yourImageName . # 在当前目录查找dockerfile 为改文件的镜像命名
10. Docker实例教程
# 使用docker 后台运行tomcat容器 并做端口映射,并修改容器的默认名字为tomcat,
docker run --name tomcat -p 8080:8080 -d tomcat
# 若要在容器内tomcat 部署程序,交互式进入,写自己的html即可
docker pull mysql # 拉去mysql 镜像
docker run -p 3306:3306 -name mysql \
-v /usr/local/deoker/mysql/conf:/etc/mysql \ # 映射宿主机目录到容器目录
-v /usr/local/docker/mysql/logs:/val/log/mysql \ # -v 数据卷
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \ # -e 指定环境边变量
-d mysql
# 若以后要重新运行时,密码变更了,需要删除宿主机下原来的数据卷,否则会不生效,还使用原来的配置。
vim Dockerfile
FROM tomcat
MAINTAINER email
ADD xxx.war /usr/local/tomcat/webapps/xxx.war # 添加war包到容器
docker build -t name . # 构建镜像
docker run -d -p 8080:8080 imageName
# 本方式是直接将war打入本镜像,比较麻烦,可使用数据卷解决
部署项目
11. 数据卷
docker run -d -P -v /webapps training/webapps python app.py
# 将tomcat容器的目录映射到宿主目录,即时原容器目录有内容也不可用
docker run -name tomcat1 -d -p 8080:8080 -v
/usr/local/docker/tomcat/share/webapps:
/usr/local/tomcat/webapps tomcat
b. 方法二 dockerfile中指定 VOLUME /var/lib/test
docker run -p 3306:3306 -name mysql \
-v /usr/local/deoker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/val/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql
# 启动数据库
12. Docker Compose
curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 或直接下载上传即可
重命名为docker-compose, 放入环境变量目录 chown -R root:root docker-compose 赋给root chmod +x docker-compose 加执行权限
# 启用tomca容器
# 原始方法:docker run .......
# docker-compose
mkdir tomcat;cd tomcat
vim docker-compose.yml # yml 语言
version: "3" # compose的版本号决定
services:
tomcat: # 服务名字,可变的
restart:always
image:tomcat
container_name:tomcat
ports:
- "8080:8080"
docker-compose up # 此时是主线程启动
docker-compose down # 停止,并删除
docker-compose up -d # 后台运行 必须在docker-compose.yml所在的目录
version: "3"
services:
tomcat:
restart:always
image:tomcat
container_name:tomcat
ports:
- "8080:8080"
volumes:
- "/usr/local/docker/tomcat/webapps/test:/usr/local/tomcat/webapps/test"
environment:
TZ: Asia/Shanghai
# mysql
version: "3"
services:
mysql:
restart: always
image:mysql
container_name:mysql
port:
- 3306:3306
environment:
TZ:Asia/Shanghai
MYSQL_ROOT_PASSWORD:123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_name=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBST\
ITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATA,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data: # docker安装目录/volumes/下创建mysql_mysql-data文件夹作为映射
# /var/lib/docker/volumes/mysql_mysql-data
项目部署
mkdir project;cd project
vim docker-compose.yml
version: 3
services:
tomcat:
restart:always
image:tomcat
container_name:tomcat
ports:
- 8080:8080
volumes:
- /usr/local/docker/project/webapps/:/usr/local/tomcat/webapps/
environment:
TZ: Asia/Shanghai
mysql:
restart: always
image:mysql
container_name:mysql
port:
- "3306:3306"
environment:
TZ:Asia/Shanghai
MYSQL_ROOT_PASSWORD:123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_name=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SU\
BSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATA,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data: