docker,docker-compose常用命令及部署
一、docker
1、常用命令
docker inspect redismaster 查看docker容器ip docker exec -it dataseciruty-shuhan /bin/sh 容器启动前提下进入docker控制台 docker build -t datasecurity-web-1.0.0 . 构建docker镜像 docker rmi imageid 删除docker镜像 docker ps -a 查看所有容器 docker run -d --restart=always -p 8091:8091 --name xinyar_erp_web_test xinyar/erp-web 运行docker容器 docker logs -f dataseciruty-shuhan 查看容器运行日志
docker cp [container-id]:容器内部文件路径 需要存放的路径 将容器内部文件下载
docker cp ecef8319d2c8:/root/test.txt /root/
docker cp 文件存放的路径 [container-id]:容器内部文件路径 将容器内部文件上传
docker cp /root/test.txt ecef8319d2c8:/root/
2、dockerfile
FROM williamyeh/java8:latest 设置项目运行所需基础镜像 EXPOSE 8081 设置端口
ENV LANG="C.UTF-8" 设置容器编码格式,防止日志打印中文乱码 ADD datasecurity-web-1.0.0.jar shuhan-web.jar 挂载运行jar包到容器位置 ENTRYPOINT ["java","-jar","shuhan-web.jar", "--spring.config.location=/shuhan-config/bootstrap.yml", "--spring.config.location=/shuhan-config/application.yml"]
jar包执行命令 后面的配置文件为项目执行的配置文件,需要在docker run 时将配置文件挂载到容器中,这样在修改配置文件后无需重新构建镜像,只需重启项目即可重新加载配置,这里使用nacos配置热加载,部分配置可以无需重启项目也可以更新配置
3、docker构建运行脚本
DOCKER_CONTAINER_NAME="dataseciruty-shuhan" # 容器名称 # 镜像相关 DOCKER_IMAGE_NAME="dataseciruty-shuhan" DOCKER_NEW_VERSION="1.0.0" # 版本是否符合 DOCKER_IMAGE_IS_MATCH_TAR_FILE="false" function destory_docker_service() { # 停止容器 for i in [ `docker ps ` ]; do if [[ "$i" == "$DOCKER_CONTAINER_NAME" ]]; then echo "尝试停止$DOCKER_CONTAINER_NAME容器..." docker stop $DOCKER_CONTAINER_NAME fi done # 删除容器 for i in [ `docker ps -a` ]; do if [[ "$i" == "$DOCKER_CONTAINER_NAME" ]]; then echo "尝试删除$DOCKER_CONTAINER_NAME容器..." docker rm $DOCKER_CONTAINER_NAME fi done } function docker_build_image() { # 清理容器(保留历史构建的镜僿 destory_docker_service if [[ $? -eq 0 ]]; then echo "应用服务容器和镜像已处理,配置文件已完成复制!" else exit 1 fi for i in [ `docker images --filter reference=$DOCKER_IMAGE_NAME` ]; do #statements if [[ "$i" == "$DOCKER_NEW_VERSION" ]]; then echo "镜像版本重复" exit 1 fi done echo "Docker镜像构建......cmd:(docker build -t $DOCKER_IMAGE_NAME:$DOCKER_NEW_VERSION .)" docker build -t $DOCKER_IMAGE_NAME:$DOCKER_NEW_VERSION . # 判断是否有镜僿存在时创建相应的容器实例 for i in [ `docker images --filter reference=$DOCKER_IMAGE_NAME` ]; do #statements echo "现有的版本信恿 $i" if [[ "$i" == "$DOCKER_NEW_VERSION" ]]; then DOCKER_IMAGE_IS_MATCH_TAR_FILE="true" echo "已经找到最新构建的镜像!" run_docker_service_image break fi done if [[ $DOCKER_IMAGE_IS_MATCH_TAR_FILE == "false" ]]; then echo "构建镜像未匹配到最新版本,已退出安裿" exit 1 fi echo "构建后的docker images镜像列表:" docker images echo "当前正在运行的Docker容器实例列表:" docker ps } function run_docker_service_image() { echo "正在启动docker 服务容器......" docker run -p 8082:8081 --name $DOCKER_CONTAINER_NAME --network mynet -d -v /root/shuhan-config/:/shuhan-config $DOCKER_IMAGE_NAME:$DOCKER_NEW_VERSION ###-v 将配置文件挂载到容器中 docker logs $DOCKER_CONTAINER_NAME } while getopts ":v:" opt do case $opt in v) echo "镜像版本为:$OPTARG" DOCKER_NEW_VERSION=$OPTARG docker_build_image ;; ?) echo "缺少版本参数-v" exit 1;; esac done
4、docker访问远程仓库操作
vim /etc/docker/daemon.json 修改docker镜像代理地址
{
"registry-mirrors": [
"https://jx0gsb4z.mirror.aliyuncs.com"
],
"insecure-registries": [
"127.0.0.1"
]
}
加入这个配置
docker login 127.0.0.1 登录docker镜像远程仓库
docker tag metabase:1.0.0 127.0.0.1/shuhan_project/metabase:1.0.0 标记仓库镜像
docker pull 127.0.0.1/shuhan_project/metabase:1.0.0 拉取镜像
docker commit -a "lzk" -m "assets analysis" 9b7519036f04 metabase:1.0.0 将容器状态打成镜像 # -a 作者 -m 说明 容器id 镜像名称:版本号
docker save 镜像名称 -o tar包放置的路径/my.tar 将镜像打成tar包
docker load -i metabase.tar 将外部tar包加载到本地docker镜像
docker push 127.0.0.1/lzk_project/metabase:1.0.0 将本地镜像推送到远程docker镜像仓库
5、docker端口操作
查看dockers容器端口映射 sudo iptables -t nat -L DOCKER -n 添加dockers容器映射--13代表行数 sudo iptables -t nat -R DOCKER 13 -p tcp -d 0.0.0.0/0 --dport 13306 -j DNAT --to-destination 172.19.0.12:3306 删除dockers容器映射 sudo iptables -t nat -D DOCKER -p tcp -d 0/0 --dport 18999 -j DNAT --to-destination 72.118.1.31:8999 保存规则 service iptables save 重启防火墙 systemctl restart iptables.service 查看防火墙规则:iptables -L systemctl restart iptables.service service iptables restart #查看容器id docker inspect [container_name] | grep IPAddress #添加转发 iptables -t nat -A DOCKER -p tcp --dport 8082 -j DNAT --to 72.118.1.34:6379 #172.17.0.3:80是容器ip+要暴露的端口 sudo iptables -A INPUT -p tcp --dport <port_number> -j ACCEPT sudo iptables -L -n -v # 删除规则 iptables -t nat -D DOCKER -p tcp -d 0/0 --dport 8080 -j DNAT --to-destination 172.19.0.5:8080 iptables -t nat -D POSTROUTING -s 172.19.0.5/32 -d 172.19.0.5/32 -p tcp -m tcp --dport 8080 -j MASQUERADE iptables -t filter -D DOCKER -d 172.19.0.5/32 -p tcp -m tcp --dport 8080 -j ACCEPT iptables -D INPUT -p tcp --dport 8080 -j ACCEPT lsof -i:6379 //如果有显示说明已经开放了,如果没有显示说明没有开放 netstat -aptn |grep -i 6379 //查看是否监听在0.0.0.0:6379 netstat -lptn |grep -i 6379 //查看TCP类型的端口 netstat -lpun |grep -i 6379 //查看UDP类型的端口 telnet 127.0.0.1 6379 //telnet IP 端口号
二、docker-compose
1、常用命令
docker-compose up -d nginx 构建建启动nignx容器 docker-compose exec metabase-nginx bash 登录到nginx容器中 docker-compose down 删除所有nginx容器,镜像 docker-compose ps 显示所有容器 docker-compose restart nginx 重新启动nginx容器 docker-compose run --no-deps --rm php-fpm php -v 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器 docker-compose build nginx 构建镜像 。 docker-compose build --no-cache nginx 不带缓存的构建。 docker-compose logs nginx 查看nginx的日志 docker-compose logs -f nginx 查看nginx的实时日志 docker-compose config -q 验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。 docker-compose events --json nginx 以json的形式输出nginx的docker日志 docker-compose pause nginx 暂停nignx容器 docker-compose unpause nginx 恢复ningx容器 docker-compose rm nginx 删除容器(删除前必须关闭容器) docker-compose stop nginx 停止nignx容器 docker-compose start nginx 启动nignx容器
2、docker-compose.yml
version: '3' services: metabase-nginx: image: my-nginx:1.18-alpine 使用基础镜像 container_name: metabase-nginx 容器名称 networks: - mynet 将容器加入统一的network下是容器与容器之间通信 ports: - "4001:4001" volumes: - /data/metabase-build/nginx.conf:/etc/nginx/nginx.conf:ro nginx配置文件 metabase-db: image: mysql:8.0 container_name: metabase-db networks: - mynet command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci #设置utf8字符集 restart: always environment: MYSQL_ROOT_PASSWORD: 123456 #root管理员用户密码 ports: - '33061:3306' #host物理直接映射端口 #报表分析平台 metabase: build: 指定运行的dockerfile context: /data/metabase-build/bin/ dockerfile: Dockerfile image: metabase container_name: metabase restart: always ports: - "4000:4000" networks: - mynet volumes: - /data/metabase-build/bin/metabase.jar:/metabase.jar environment: metabase配置 TZ: Asia/shanghai MB_JETTY_PORT: 4000 MB_DB_TYPE: mysql MB_DB_DBNAME: metabase MB_DB_PORT: 3306 MB_DB_USER: root MB_DB_PASS: 123456 MB_DB_HOST: 123.123.123.123 MB_JETTY_HOST: 0.0.0.0 networks: mynet: external: true