献帝初平元年,关东诸军起兵讨伐董卓,推袁绍为盟主,曹操为奋武将军。关东诸军名为讨伐董卓,实际各自心怀鬼胎,伺机拓展自己势力。不久,诸军之间发生摩擦,相互火并。
初平三年,司徒王允与吕布在长安计杀董卓,董卓部将李傕、郭汜等攻陷长安,关中陷入战乱。
济北相鲍信迎接曹操出任兖州牧,曹操进攻黄巾军,将黄巾击败,获得降军三十多万人,号称“青州兵”。
献帝初平四年,曹操进兵徐州,因为手段太过残忍,大肆屠杀徐州城。陈留太守张邈和曹操部将陈宫对曹操不满,于是背叛曹操,迎接吕布为兖州牧。
此时形势非常危急,曹操从徐州率军赶回,与吕布军对峙濮阳,二军相持百余日,蝗灾大起,双方停战。来年,曹操整军再战吕布,大破吕布军,吕布逃往徐州投靠刘备。
曹操的谋士毛玠向曹操提出了“挟天子以令诸侯”的建议,建安元年,曹操迎回献帝,迁都许县,曹操被封为大将军、武平侯。
建安三年,曹操东征徐州,进攻与他为敌的吕布。在曹军攻势之下,吕布军上下离心,吕布见大势已去,出城投降,曹操将吕布、陈宫处死。
建安五年,董国舅事件,刘备逃出京城。之后刘备突袭徐州刺史车胄,占领徐州。
曹操为了避免与袁绍作战时前后受敌,于是决定先消灭刘备。进军徐州,以迅雷不及掩耳之势击破刘备,刘备逃走投靠袁绍。
袁绍有冀、并、幽、青四州之地,有军队数十万人,根本不把曹操放在眼里。袁绍命大将颜良进兵白马,自率大军进屯黎阳,向曹操发动攻击。
二月,袁军颜良围攻白马,拉开了大战的序幕。四月,曹操亲自率军北上解白马之围,他采纳谋士荀攸之计,故意做出要渡河袭击袁军的态势,吸引袁军分兵西向,然后突然转向迅速赶往白马。曹操军突然杀到,袁军措手不及,关羽策马刺颜良于万众之中,斩其首级,袁军大败。
袁绍闻知,立即渡河追赶曹操。曹操见追兵渐近,命将士故意放出马匹,并将所有物资放于大道之上。袁军追兵到达,竟争抢物资,阵形大乱。曹操率领仅有的骑兵突然杀出,大破追兵,关羽再斩袁绍另一大将文丑。
颜良、文丑为袁军名将,二将分别被杀,袁军大伤。
八月,袁绍大军连营而进,东西数十里,进逼官渡。曹操率军坚守,两军一攻一守,相持近二个月。久战之下,粮食将尽,曹操的处境变为极为困难。
十月,袁绍从河北运来粮草,派大将淳于琼于乌巢看守。恰好此时袁绍谋士许攸来投奔曹操,献计让曹操偷袭乌巢。曹操大喜,亲自率精锐骑兵五千人,乘夜偷袭乌巢。
曹操军至乌巢,曹操命令四处放火,袁军大乱,淳于琼拒营死守。当袁绍听说曹操袭击乌巢时,认为这正是攻破曹操大营的好机会,以重兵围攻曹操大营。但曹营未破,乌巢败讯已经传来,袁军溃散,大将张合等人投降曹操。