docker的那些事儿

本文详细介绍了Docker的使用技巧,包括如何登录Docker仓库,清除镜像缓存,使用docker-compose操作服务,解决非root用户执行权限问题,以及在运行镜像时处理环境变量的特殊字符。同时,提到了在同一个机器上运行相同镜像时避免名称冲突的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.docker 登录

cli:docker login {domain} or {ip address}

注意:如果执行docker login,不带域名或者ip地址,则默认登录https://hub.docker.com

 

2.docker编译镜像时,强制清掉本地旧的镜像缓存:

docker build --no-cache -t u12_core -f u12_core .

如果docker镜像占用本地太多存储空间,可以执行以下指令:

docker system prune -a --volumes

相关参考:Docker is filling up my disk space 

 

3.docker-compose相关

(1)docker-compose启动/停止/重启特定服务:

docker-compose -f /docker-compose/docker-compose-helloworld.yml start/stop/restart HTTP_IME

(2)docker-compose启动/停止一组服务:

启动: docker-compose -f /docker-compose/docker-compose-helloworld.yml up -d

停止: docker-compose -f /docker-compose/docker-compose-helloworld.yml

(3)如果docker-compose中包含的服务有些启动失败,此时可以通过以下命令查看相应服务的启动log:

docker-compose -f /docker-compose/docker-compose-helloworld.yml logs HTTP_IME

(4)docker-compose.xml目录挂载:

volumes:

- ../:/ime

- ../log:/ssd

即格式为:运行docker物理机待映射路径:docker镜像中的代码使用的路径

(5)如果docker服务端口需要外部访问,如(mysql和redis,测试环境需要在宿主机访问)记得使用ports设置映射:

image: mysql:5.7
ports:
  - '3306:3306'

相关参考:What is the difference between docker-compose ports vs expose

(6)docker-compose起来的mysql实例设置默认字符集:

加上command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']

db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: qwerasdf
      MYSQL_DATABASE: docker_db
    restart: always
    volumes:
      - "/Users/hehe/docker_v/docker_test/db:/var/lib/mysql"
    command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']

相关参考:How to change the default character set of mysql using docker-compose?

4.非root用户docker命令每次都需要sudo执行的解决方案

(1)创建docker组:sudo groupadd docker

(2)将当前用户加入docker组:sudo gpasswd -a ${USER} docker

(3)重启服务:sudo service docker restart

(4)刷新docker成员:newgrp - docker

*(5)记得reboot一下,否则新开一个terminal输入docker依然提示需要sudo

5.docker run同一个镜像时,如果指定container的名字(--name)相同,也即如果在一台机器上执行以下命令2次:

docker run  --name redis-1 redis:3

则会报错:“docker: Error response from daemon: Conflict. The container name "/redis-1" is already in use by container "5e46d5502ff04d1ef55077b183dd1e401c741811d7e07b951bf914cc92ca36b2". You have to remove (or rename) that container to be able to reuse that name.”

总结:如果需要一个机器上需要docker run同一个镜像多次,则需要给container指定不同的名字(或者不指定,使用默认的名字)

6.docker run使用--env 指定的环境变量值中包含特殊字符,如"!"或者"&"时,变量值应该用单引号包起来,而不是用双引号,如下:

docker run --env TEST_DATABASE_DSN='mysql://test:hehe!123@db-test.test.awsor:3306/test' registry.test.com:443/proj/test:master

相关参考:How to escape “!” and “&” in docker's environment varibles

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值